为 Elasticsearch
对于需要组合多个搜索条件的复杂查询,请使用查询正文。 查询子句有助于决定文档是否与搜索匹配,从而返回更精确的结果。
与 Elasticsearch 的集成使用关键字搜索,但您可以在代理中将查询正文配置为高级 Elasticsearch 设置,以启用更高级的搜索技术,例如:
使用 ELSER 进行语义搜索。
k-nearest neighbor ( kNN ) 密集向量搜索。
嵌套查询,用于搜索嵌套文档。
混合搜索。
在语义文本字段中进行搜索。
使用 ELSER 进行语义搜索
利用 ELSER 进行语义搜索,通过了解用户查询背后的上下文和意图来提高搜索准确性和相关性。 如需了解更多信息,请参阅 Elasticsearch 文档中的“使用ELSER进行语义搜索 ”。
下面的代码片段展示了使用 ELSER 进行语义搜索的示例。 该示例使用布尔查询来匹配符合其他查询布尔组合的文档。
{
"query": {
"bool": {
"should": [
{
"text_expansion": {
"ml.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
}
}
其中:
ml.tokens
它指的是存储 ELSER 标记的字段。 如果您在索引中使用了不同的字段,可能需要对其进行更新。 如果没有 ELSER 标记,也可以使用包含原始文本的字段,但搜索质量可能会下降。
.elser_model_2_linux-x86-64
它是 ELSER v2 优化版本的型号 ID,如果 Elasticsearch 部署中有该型号,请使用它。 否则,常规 ELSER v2 模型使用 .elser_model_2 ,ELSER v1 使用 .elser_model_1 。
$QUERY
它是用于访问用户查询的变量。 它可以确保将用户查询传递给查询主体。
$FILTER
这是用于访问您在 Elasticsearch 的高级设置中配置的自定义过滤器的变量。 它可以确保在查询正文中使用自定义筛选器。
K 最近邻( 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 中的“为密集向量搜索设置文本嵌入 ”。
text_embedding低于query_vector_builder
它是要运行的自然语言处理任务。 它必须是 text_embedding ,以便 kNN 搜索。
intfloat__multilingual-e5-small
它是嵌入模型 ID。 如果您想使用不同的嵌入模型,可能需要对其进行更新。
$QUERY
它是用于访问用户查询的变量。 它可以确保将用户查询传递给查询主体。
$FILTER
这是用于访问您在 Elasticsearch 的高级设置中配置的自定义过滤器的变量。 它可以确保在查询正文中使用自定义筛选器。
使用 ELSER 在嵌套文档中使用嵌套查询进行搜索
当 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 的高级设置中配置的自定义过滤器的变量。 它可以确保在查询正文中使用自定义筛选器。 如果应用于外部文档,则筛选器中仅可使用外部字段。 如果应用于内部文档,则过滤器中只能使用内部字段。
结合关键词搜索和密集矢量搜索的混合搜索
下面的代码片段展示了一个在 Elasticsearch 索引上进行复杂搜索查询的示例,它将传统文本搜索与 k-nearest neighbors ( kNN ) 搜索和排序相结合:
{
"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
它指的是存储密集矢量的字段。 如果您在索引中使用了不同的字段,可能需要对其进行更新。
text_embedding低于query_vector_builder
这就是要执行的自然语言处理任务。 它必须是 text_embedding ,以便 kNN 搜索。
intfloat__multilingual-e5-small
它是嵌入模型 ID。 如果您想使用不同的嵌入模型,可能需要对其进行更新。
$QUERY
它是用于访问用户查询的变量。 它可以确保将用户查询传递给查询主体。
$BODY_FIELD_NAME和$TITLE_FIELD_NAME
它们是访问搜索集成中配置的正文字段和标题字段的变量。
$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
它指定查询的类型,在本例中是稀疏向量查询。 与 text_expansion 查询相比,它是一种类似但较新的查询类型。
semtext.inference.chunks.embeddings
它指的是存储分块文本嵌入的字段。