いくつかのフィールドを持つ単一タイプの「user」を持つ「users」の非常に基本的なインデックスがあります。それ以外にインデックスには何も定義されていません。
私がする必要があるのは、プレフィックスの一致(ユーザー名の場合)を優先するオートコンプリートの結果を提供することですが、ユーザーの略歴とWebサイトからの他の一致、および他のフィールドのサブストリングの一致も含みます。
クエリDSLでこれをどのように達成しますか?
いくつかのフィールドを持つ単一タイプの「user」を持つ「users」の非常に基本的なインデックスがあります。それ以外にインデックスには何も定義されていません。
私がする必要があるのは、プレフィックスの一致(ユーザー名の場合)を優先するオートコンプリートの結果を提供することですが、ユーザーの略歴とWebサイトからの他の一致、および他のフィールドのサブストリングの一致も含みます。
クエリDSLでこれをどのように達成しますか?
あなたが望むものを達成するためのさまざまな方法があります。接頭辞を一致させたい方法に依存すると思います。プレフィックス クエリを使用するか、ユーザー フィールドからEdgeNGramsを作成して、プレフィックス クエリを必要とせずに検索することができます。最初のオプションは少し遅くなりますが、2 番目のオプションでは、より多くの用語 (ngram) をインデックス化するため、インデックス サイズが増加します。
プレフィックス クエリを使用する場合は、さまざまなクエリを組み合わせる必要があります。bool queryを使用してそれを行うことができます。どのクエリが一致する必要があるか、どのクエリが一致してはならず、どのクエリが一致する必要があるか (それらがオプションの場合) を決定する必要があります。たとえば、プレフィックスの一致がより重要であることを表現するために、各クエリにブーストを与えることもできます。
一方、EdgeNGrams のインデックスを作成する場合は、次のように、単一のクエリ文字列を使用してさまざまなフィールドを検索し、それらにさまざまな重みを与えることができます。
{
"query" : {
"query_string" : {
"fields" : "user.ngrams^3 field1^2 field2",
"query" : "query"
}
}
}
また、クエリ文字列を使用して複数の用語を検索し (それらからブール クエリが生成されます)、 lucene クエリ構文を使用できることも考慮する必要があります。また、クエリ文字列は分析されますが、プレフィックス クエリは分析されません。それはすべて、必要なものと、それらの機能がユースケースに役立つかどうかによって異なります。
さらに情報が必要な場合はお知らせください。