4

次の種類のクエリを実行できるようにしたいと思います。

インデックスに登録するデータは、タイトルだけが興味深いミュージックビデオ(たとえば)で構成されています。これらにインデックスを付けてからクエリを作成し、ユーザーがクエリで使用した単語に関係なく、タイルの先頭にあるこれらの単語を含むドキュメントが最初に返され、その後に(タイトルの任意の位置に検索された単語の少なくとも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使用 して)?そうでない場合は、上記のどれがパフォーマンスの面で優れていますか?

4

2 に答える 2

5

そのためにLuceneペイロードを使用できます。フィールド値のすべての項にカスタムブーストを与えることができます。

したがって、タイトルにインデックスを付けるときは、ブースト係数3を使用し始めることができます(たとえば)。

タイトル:野生|3.0クリーチャー|2.5|2.0|1.5

タイトル:|3.0クリーチャー|2.5

この方法でインデックスを作成すると、タイトルの先頭に最も近い用語がブーストされます。

このアプローチを使用する主な問題は、アナライザーがそのように構造化されたテキスト(term1 | 1.1 term2 | 3.0 term3)を必要とするため、自分でトークン化し、このすべてのブースト情報を「手動で」追加する必要があることです。

于 2013-02-26T00:00:10.410 に答える
1

あなたができることは、タイトルと各トークンを別々にインデックス付けすることです。たとえば、テキストwild deep blue endless seaは次のようにインデックス付けされます。

title: wild deep blue endless sea
t1: wild
t2: deep
t3: blue
t4: endless
t5: sea

次に、誰かが「ワイルドディープ」をクエリすると、クエリは次のように書き直されます。

title:"wild deep" OR (t1:wild AND t2:deep)

このようにして、一致するすべてのドキュメント(一致する場合title)を常に見つけることができますが、一致するt1..tNトークンは関連するドキュメントのスコアを高くします。

于 2013-02-25T16:33:01.433 に答える