2012-02-29 28 views
0

私は別々のスキーマを持つ複数のSolrインスタンスを持っています。フィールド値に基づいてSolrの複数値フィールドをソート

複数値のフィールドをソート順に受け取る必要があります。 train_station、空港、city_districtなど:タイプによって

q=köln&sort=query({!v="type:(airport OR train_station)"}) desc 

私はtrain_stationタイプの前に空港の種類に関するドキュメントを参照してくださいしたいと思います。今のところ私はいつもtrain_stationタイプを上にしています。

どのようにクエリを書くべきですか?

答えて

6

IDFのために、先頭にtrain_stationが表示されています。

速いハックは、範囲クエリ(一定のスコアを持つという利点があります)とクエリブーストを使用することです:q=köln&sort=query({!v="type:([airport TO airport]^3 OR [train_station TO train_station]^2)"}) desc

この方法で、自分のタイプフィールドでairportを持つ文書は3のスコアを持つことになり、そのタイプフィールドでtrain_stationを持っている文書は、2のスコアを持つことになり、そのフィールドタイプにairporttrain_stationを持っている文書がありますスコアは2 + 3 = 5(乗法定数に)。

これを行うより洗練された(効果的な)方法は、カスタムクエリパーサー(または関数クエリ)を作成することです。

+1

これは巧妙なクイックハックです。 –

+0

なぜ「type:(airport^3 OR train_station^2)」のような簡単な比較をする代わりに範囲を選択しましたか? – rounak

+1

ブーストしても、IDFは引き続き考慮されるためです。あなたの質問では、train_stationが空港よりもはるかに稀であれば、それを含む文書は空港を含む文書より高いスコアをつけます。 – jpountz

0

フィールド内のアイテムを注文するには、必要な順序でインデックスを作成するか、後処理を行う必要があります。ソルの並べ替えはドキュメントだけをソートします!

1

関数ごとに並べ替えることができるのは、ドキュメントごとに1つの値を返す場合だけです。あなたは間違いなくmultiValuedフィールドまたはトークン化されているフィールドをソートすることはできません。フィールドに「空港」が含まれている場合(「鉄道駅」が含まれていても)「空港」を返し、「駅」は含まれていて「空港」は含まれていない場合は「駅」を返し、次に並べ替える機能が必要なようですその上に。

別のオプションは、インデックス時にこれを処理することです。 「airport_train_station_sort」というフィールドを追加し、フィールドに「空港」が含まれている場合は1を返し、フィールドに「駅」は含まれていても空港は含まれていない場合は2を、フィールドが含まれていない場合は3を返します。そのフィールドを並べ替えるだけです。

1

この問題はSOLRでは解決できません。ドキュメントをチェックすると、SOLRは複数値フィールドをソートしません。古いバージョンのSOLRでは試してみましたが、結果は未定義で予測できませんでした。

スキーマを変更して、このソートデータを単一値の索引付きフィールドに入れるか、空港、市区町村、列車駅の順に複数のクエリを実行する必要があります。

関連する問題