4

適切な Lucene の並べ替えまたはランキングを実装する方法がよくわからないという長期的な問題がありました。都市とその人口のリストがあるとします。誰かが「new」または「london」を検索した場合、人口順で並べ替えられたプレフィックス一致のリストが必要です。プレフィックス検索とフィールドによる並べ替えを逆にして、人口フィールド、IE ニューメキシコ、ニューヨークがあります。 ; またはロンドン、ロンドンデリー。

ただし、正確に一致する名前が常に一番上にあることも常に望んでいます。したがって、「ロンドン」の場合、リストには「ロンドン、ロンドン、ロンドンデリー」と表示されます。最初のロンドンは英国にあり、2 番目のロンドンはコネチカットにあります。ロンドン デリーの人口がロンドン CT よりも多い場合でも同様です。

単一のクエリ ソリューションを持っている人はいますか?

4

3 に答える 3

3

dlamblin、これが正しく取得されるかどうかを確認します。プレフィックスベースのクエリを作成してから、結果を母集団で並べ替え、並べ替え順序と完全一致の優先度を組み合わせます。検索を並べ替えから分離し、並べ替えにCustomSorterを使用することをお勧めします。カスタム並べ替えについて説明しているブログエントリは次のとおりです。 古典的なLuceneの本は、これをよく説明しています。

于 2008-08-31T11:40:56.760 に答える
1

の API

ソートコンパレータ

言う

フィールド内の一意の用語ごとに個別の Comparable があります。一部のドキュメントのフィールドに同じ用語が含まれている場合、キャッシュ配列には同じ Comparable を参照するエントリが含まれます。

あなたは適用することができます

FieldSortedHitQueue

APIが言うComparatorフィールドを持つsortcomparatorに...

ソート対象の各フィールドに対応するコンパレータを格納します。

したがって、用語はそれに応じてソートできます

于 2009-09-04T09:06:38.917 に答える
0

私の現在の解決策は、正確なサーチャーとプレフィックスサーチャーを作成し、どちらも逆母集団でソートしてから、正確なヒットから始まるすべてのヒットをコピーして、プレフィックスヒットに移動することです。結果のページングは​​、私が思っているよりも少し面倒です。

また、ハッシュを使用して重複を排除しましたが、後でプレフィックスサーチャーをプレフィックス検索のブールクエリ (MUST) と完全一致検索 (MUST NOT) に変更して、Lucene に重複を削除させました。これはさらに無駄に思えましたが。

編集: コメントに移動しました (機能が存在するため): Yuval Fブログの投稿をありがとうございます ... アクセスできない場合、名前フィールド「london」が検索語「london」と完全に一致することをソートコンパレーターはどのように認識しますか?検索語?

于 2008-08-12T05:55:04.920 に答える