次の種類のクエリを実行できるようにしたいと思います。
インデックスに登録するデータは、タイトルだけが興味深いミュージックビデオ(たとえば)で構成されています。これらにインデックスを付けてからクエリを作成し、ユーザーがクエリで使用した単語に関係なく、タイルの先頭にあるこれらの単語を含むドキュメントが最初に返され、その後に(タイトルの任意の位置に検索された単語の少なくとも1つを含むドキュメントによる特定の順序はありません。また、これはすべて大文字と小文字を区別しないようにする必要があります。
例:
ドキュメントの場合:
- Video1Title=海は青い
- Video2Title=野生の海
- Video3Title=野生の海何でも
- Video4Title=シーサイド何でも
「海」を検索したら取得したい
- 「Video1Title=海は青い」
最初に、タイトルに「海」が含まれているが最初には含まれていない他のすべてのドキュメントが続きます。
「荒海」を検索したらゲットしたい
- Video2Title=野生の海
- Video3Title=野生の海何でも
最初に、タイトルに「Wild」または「Sea」が含まれているが、タイトルの接頭辞として「WildSea」が含まれていない他のすべてのドキュメントが続きます。
「Seasi」を検索した場合、何も取得したくありません(キーワードのトークン化とプレフィックスクエリは気にしません)。
現在、AFAIKSでは、Luceneに「word1とword2などが位置1と2と3などにあるドキュメントを見つけてください」と伝える実際の方法はありません。
その動作をシミュレートするための「回避策」があります。
フィールドに2回インデックスを付けます。
field1
トークン化された単語(おそらくを使用)StandardAnalyzer
があり、field2
それらすべてが1つの要素にまとめられています(を使用KeywordAnalyzer
)。次に、次のようなものを検索すると:+(field1:word1 word2 word3)(field2: "word1 word2 word3 *")
Luceneに「ドキュメントのタイトルにはword1、word2、またはword3が含まれている必要があり、さらに「タイトルは> word1 word2 word3 <で始まる」と一致するものの方が優れています(スコアが高くなります)。
- フィールドの先頭に「lucene_start_token」を追加してインデックスを作成し
、残りの部分は
Video2Title = Wild sea
「」などのようにインデックスを付けます。title:lucene_start_token Wild sea
次に、次のようなクエリを実行します。
+(title:sea)(title: "lucene_start_token sea")
また、Luceneに、タイトルに私の検索語を含むすべてのドキュメントを返してもらい、「lucene_start_token+searchwords」に一致したドキュメントのスコアを上げます。
私の質問は、これを行うためのより良い方法は本当にありますか(おそらくPhraseQueryとTermpositionを使用 して)?そうでない場合は、上記のどれがパフォーマンスの面で優れていますか?