1

いくつかのフィールドを持つ単一タイプの「user」を持つ「users」の非常に基本的なインデックスがあります。それ以外にインデックスには何も定義されていません。

私がする必要があるのは、プレフィックスの一致(ユーザー名の場合)を優先するオートコンプリートの結果を提供することですが、ユーザーの略歴とWebサイトからの他の一致、および他のフィールドのサブストリングの一致も含みます。

クエリDSLでこれをどのように達成しますか?

4

1 に答える 1

5

あなたが望むものを達成するためのさまざまな方法があります。接頭辞を一致させたい方法に依存すると思います。プレフィックス クエリを使用するか、ユーザー フィールドからEdgeNGramsを作成して、プレフィックス クエリを必要とせずに検索することができます。最初のオプションは少し遅くなりますが、2 番目のオプションでは、より多くの用語 (ngram) をインデックス化するため、インデックス サイズが増加します。

プレフィックス クエリを使用する場合は、さまざまなクエリを組み合わせる必要があります。bool queryを使用してそれを行うことができます。どのクエリが一致する必要があるか、どのクエリが一致してはならず、どのクエリが一致する必要があるか (それらがオプションの場合) を決定する必要があります。たとえば、プレフィックスの一致がより重要であることを表現するために、各クエリにブーストを与えることもできます。

一方、EdgeNGrams のインデックスを作成する場合は、次のように、単一のクエリ文字列を使用してさまざまなフィールドを検索し、それらにさまざまな重みを与えることができます。

{
    "query" : {
        "query_string" : {
            "fields" : "user.ngrams^3 field1^2 field2",
            "query" : "query"
        }
    }
}

また、クエリ文字列を使用して複数の用語を検索し (それらからブール クエリが生成されます)、 lucene クエリ構文を使用できることも考慮する必要があります。また、クエリ文字列は分析されますが、プレフィックス クエリは分析されません。それはすべて、必要なものと、それらの機能がユースケースに役立つかどうかによって異なります。

さらに情報が必要な場合はお知らせください。

于 2012-09-22T10:56:57.593 に答える