のクエリ・ボディの設定 Elasticsearch
複数の検索条件を組み合わせる必要がある複雑なクエリには、クエリボディを使用します。 クエリー句は、文書が検索にマッチするかどうかを判断し、より正確な結果を返すのに役立つ。
Elasticsearch との統合ではキーワード検索を使用しますが、クエリボディをエージェントの高度な Elasticsearch 設定として構成することで、以下のような、より高度な検索テクニックを有効にすることができます:
- ELSERによる意味検索。
- k-nearest neighbor ( kNN ) 密なベクトル探索。
- 入れ子になった文書を検索する入れ子クエリ。
- ハイブリッド検索
- セマンティック・テキスト・フィールドで検索する。
ELSERによる意味検索
ELSERを使用したセマンティック検索では、ユーザーのクエリの背後にあるコンテキストと意図を理解することで、検索の精度と関連性を高めることができます。 詳細については、を ELSERによる意味検索 参照してください Elasticsearch ドキュメント。
次のコード・スニペットは、ELSERを使ったセマンティック検索の例です。 この例では、他のクエリのブール値の組み合わせに一致するドキュメントをマッチングするために を使用 ブール式 しています。
{
"query": {
"bool": {
"should": [
{
"text_expansion": {
"ml.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
}
}
ここで:
ml.tokensELSERトークンを格納するフィールドを指す。 インデックスに別のフィールドを使用する場合は、更新する必要があるかもしれません。 ELSERトークンが利用できない場合は、生のテキストを含むフィールドを使用することもできますが、検索の質が低下する可能性があります。
.elser_model_2_linux-x86-64ELSER v2 の最適化されたバージョンのモデル ID です。 Elasticsearch のデプロイメントで利用可能な場合に使用します。 それ以外の場合は、通常の ELSER v2 モデルには
.elser_model_2を、ELSER v1 には.elser_model_1を使用する。$QUERYユーザークエリにアクセスするための変数である。 ユーザーのクエリがクエリ・ボディに確実に渡されるようにすることができる。
$FILTERこれは、の高度な設定で構成するカスタムフィルター Elasticsearch にアクセスするための変数です。 カスタムフィルターがクエリ本体で使用されていることを確認できます。
k-arest neighbor ( kNN ) 密なベクトル探索
ベクトル埋め込み(例:テキスト検索)に基づいて類似アイテムを効率的に検索するために検索 kNN 機能を利用します。 詳細については、のを kNN 検索 参照してください Elasticsearch ドキュメント。
次のコード・スニペットは、 kNN 密ベクトル検索の例を示している:
{
"knn": {
"field": "text_embedding.predicted_value",
"query_vector_builder": {
"text_embedding": {
"model_id": "intfloat__multilingual-e5-small",
"model_text": "$QUERY"
}
},
"k": 10,
"num_candidates": 100,
"filter" : "$FILTER"
}
}
ここで:
text_embedding.predicted_value密なベクトルを格納するフィールドを指す。 インデックスに別のフィールドを使用する場合は、更新する必要があるかもしれません。 詳細については、. Elasticsearchにおける高密度ベクトル検索のためのテキスト埋め込みの設定を参照してください。
query_vector_builderの下のtext_embedding実行するのは自然言語処理タスクだ。 kNN 検索には
text_embeddingが必要。intfloat__multilingual-e5-small埋め込みモデルのIDである。 異なるエンベッディングモデルを使いたい場合は、更新する必要があるかもしれません。
$QUERYユーザークエリにアクセスするための変数である。 ユーザーのクエリがクエリ・ボディに確実に渡されるようにすることができる。
$FILTERこれは、の高度な設定で構成するカスタムフィルター Elasticsearch にアクセスするための変数です。 カスタムフィルターがクエリ本体で使用されていることを確認できます。
ELSERでネストされたクエリを使ってネストされたドキュメントを検索する
Wrapsは、インデックス Elasticsearch にネストされたドキュメントが含まれる場合に、その ネストされたクエリ インデックス内のネストされたフィールドを検索するためのクエリをさらにラップします。 マッチした場合、クエリはルートの親ドキュメントと、マッチしたネストしたドキュメントを返します。 検索結果にフィルタを適用する場合、親文書または入れ子文書のいずれかをフィルタリングするように選択できます。
外部文書のクエリ
次のコード・スニペットは、 Elasticsearch インデックス内の外部文書をクエリーする例を示している。
この例では、外側のドキュメントが、 ネストされたドキュメントを含むメイン・ドキュメントです。 passages nested クエリは、 passages ネストされた文書内を検索する。
ネストされたドキュメント内でマッチが見つかった場合、クエリはマッチしたネストされたドキュメントとともにアウタードキュメントを返す。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "passages",
"query": {
"text_expansion": {
"passages.sparse.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
},
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
}
}
],
"filter": "$FILTER"
}
},
"_source": false
}
内部ドキュメントのクエリ
次のコード・スニペットは、ネストされたドキュメント内の内部ドキュメントをクエリーする例を示しています。
この例では、ネストされたドキュメント内の展開されたテキストを検索し、フィルタを適用し、ソースから特定のフィールドを除いて、一致するネストされたドキュメントを持つ親ドキュメントを返します。
{
"query": {
"nested": {
"path": "passages",
"query": {
"bool": {
"should": [
{
"text_expansion": {
"passages.sparse.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
},
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
}
},
"_source": false
}
ここで:
passages親文書の中に内部文書を格納する入れ子フィールドである。 インデックスで別のネストされたフィールドを使用する場合は、更新する必要があるかもしれません。
passages.sparse.tokens内部文書のELSERトークンまたは生テキストを格納するフィールドを指す。 インデックスで別のネストされたフィールドを使用する場合は、更新する必要があるかもしれません。 ELSERトークンが利用できない場合は、生のテキストを含むフィールドを使用することもできますが、検索の質が低下する可能性があります。
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}検索結果の内部文書からELSERトークンを除外する。
"_source": false検索結果の中の内側の文書だけが使用されるため、検索結果のトップレベルのフィールドはすべて除外される。
$QUERYユーザークエリにアクセスするための変数である。 ユーザーのクエリがクエリ・ボディに確実に渡されるようにすることができる。
$FILTERこれは、の高度な設定で構成するカスタムフィルター Elasticsearch にアクセスするための変数です。 カスタムフィルターがクエリ本体で使用されていることを確認できます。
外側のドキュメントに適用した場合、フィルターで使用できるのは外側のフィールドのみです。 内部文書に適用された場合、内部フィールドのみがフィルターで使用可能になります。
キーワード検索と密なベクトル検索を組み合わせたハイブリッド検索
次のコード・スニペットは、従来のテキスト検索とk-nearest neighbors ( kNN ) 検索とランキングを組み合わせた、 Elasticsearch インデックスでの複雑な検索クエリの例を示しています:
{
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "$QUERY",
"fields": ["$BODY_FIELD_NAME", "$TITLE_FIELD_NAME"],
}
}
],
"filter" : "$FILTER"
}
},
"knn": {
"field": "text_embedding.predicted_value",
"query_vector_builder": {
"text_embedding": {
"model_id": "intfloat__multilingual-e5-small",
"model_text": "$QUERY"
}
},
"k": 10,
"num_candidates": 100,
"filter" : "$FILTER"
},
"rank": {
"rrf": {}
},
"size": 10,
"_source": {"excludes": ["text_embedding.predicted_value"]}
}
ここで:
text_embedding.predicted_value密なベクトルを格納するフィールドを指す。 インデックスに別のフィールドを使用する場合は、更新する必要があるかもしれません。
query_vector_builderの下のtext_embeddingそれは自然言語処理のタスクである。 kNN 検索には
text_embeddingが必要。intfloat__multilingual-e5-small埋め込みモデルのIDである。 異なるエンベッディングモデルを使いたい場合は、更新する必要があるかもしれません。
$QUERYユーザークエリにアクセスするための変数である。 ユーザーのクエリがクエリ・ボディに確実に渡されるようにすることができる。
$BODY_FIELD_NAMEおよび$TITLE_FIELD_NAMEこれらは、検索統合で設定されたBodyフィールドとTitleフィールドにアクセスするための変数です。
$FILTERこれは、の高度な設定で構成するカスタムフィルター Elasticsearch にアクセスするための変数です。 カスタムフィルターがクエリ本体で使用されていることを確認できます。
rank.rrfキーワード検索と高密度ベクトル検索の検索結果を組み合わせる相互ランク融合(rrf)法である。
"_source": {"excludes": ["text_embedding.predicted_value"]}検索結果に不必要に密集したベクトル場を除外する。
ネストされたクエリーを使ってセマンティック・テキスト・フィールドを検索する
セマンティック・テキスト・フィールドでネストされたドキュメントをクエリするには、以下の構造を使用してください。 この構造により、 Elasticsearch との統合で検索が適切に機能する。
{
"query": {
"nested": {
"path": "semtext.inference.chunks",
"query": {
"sparse_vector": {
"field": "semtext.inference.chunks.embeddings",
"inference_id": ".elser_model_2_linux-x86_64",
"query": "$QUERY"
}
},
"inner_hits": {"_source": {"excludes": ["semtext.inference.chunks.embeddings"]}}
}
},
"_source": false
}
ここで:
semtextセマンティック・フィールドの名前である。 セマンティックフィールドの名前が違う場合は、更新する必要があるかもしれません。 詳細については、を セマンティックテキストフィールドタイプ
参照してください Elasticsearch ドキュメント。
semtext.inference.chunksチャンクされたテキストと埋め込みを保存するフィールドを指す。
sparse_vectorこれはクエリーのタイプを指定するもので、この場合はsparse_vectorクエリーである。 これは、
text_expansionクエリと似ているが、新しいタイプのクエリである。semtext.inference.chunks.embeddingsチャンクされたテキストの埋め込みを格納するフィールドを指す。