语义查询
编辑语义查询
编辑此功能处于 Beta 阶段,可能会发生更改。其设计和代码不如正式 GA 功能成熟,并且按“原样”提供,不提供任何保证。Beta 功能不受正式 GA 功能的支持 SLA 约束。
semantic
查询类型允许您对存储在 semantic_text
字段中的数据执行语义搜索。
请求示例
编辑resp = client.search( index="my-index-000001", query={ "semantic": { "field": "inference_field", "query": "Best surfing places" } }, ) print(resp)
const response = await client.search({ index: "my-index-000001", query: { semantic: { field: "inference_field", query: "Best surfing places", }, }, }); console.log(response);
GET my-index-000001/_search { "query": { "semantic": { "field": "inference_field", "query": "Best surfing places" } } }
semantic
的顶层参数
编辑-
field
- (必需,字符串)要执行查询的
semantic_text
字段。 -
query
- (必需,字符串)要在该字段中搜索的查询文本。
请参阅此教程,了解有关使用 semantic_text
和 semantic
查询进行语义搜索的更多信息。
使用 semantic
查询进行混合搜索
编辑semantic
查询可以用作混合搜索的一部分,其中 semantic
查询与词法查询相结合。例如,以下查询查找 title
字段与“mountain lake”匹配的文档,并将其与在 title_semantic
字段(一个 semantic_text
字段)上进行的语义搜索结果结合起来。然后对组合的文档进行评分,并返回评分最高的 3 个文档。
resp = client.search( index="my-index", size=3, query={ "bool": { "should": [ { "match": { "title": { "query": "mountain lake", "boost": 1 } } }, { "semantic": { "field": "title_semantic", "query": "mountain lake", "boost": 2 } } ] } }, ) print(resp)
const response = await client.search({ index: "my-index", size: 3, query: { bool: { should: [ { match: { title: { query: "mountain lake", boost: 1, }, }, }, { semantic: { field: "title_semantic", query: "mountain lake", boost: 2, }, }, ], }, }, }); console.log(response);
POST my-index/_search { "size" : 3, "query": { "bool": { "should": [ { "match": { "title": { "query": "mountain lake", "boost": 1 } } }, { "semantic": { "field": "title_semantic", "query": "mountain lake", "boost": 2 } } ] } } }
您还可以将 semantic_text 用作倒数排名融合的一部分,以更轻松地对相关结果进行排名
resp = client.search( index="my-index", retriever={ "rrf": { "retrievers": [ { "standard": { "query": { "term": { "text": "shoes" } } } }, { "standard": { "query": { "semantic": { "field": "semantic_field", "query": "shoes" } } } } ], "rank_window_size": 50, "rank_constant": 20 } }, ) print(resp)
const response = await client.search({ index: "my-index", retriever: { rrf: { retrievers: [ { standard: { query: { term: { text: "shoes", }, }, }, }, { standard: { query: { semantic: { field: "semantic_field", query: "shoes", }, }, }, }, ], rank_window_size: 50, rank_constant: 20, }, }, }); console.log(response);
GET my-index/_search { "retriever": { "rrf": { "retrievers": [ { "standard": { "query": { "term": { "text": "shoes" } } } }, { "standard": { "query": { "semantic": { "field": "semantic_field", "query": "shoes" } } } } ], "rank_window_size": 50, "rank_constant": 20 } } }
在 semantic_text
字段上进行高级搜索
编辑semantic
查询使用默认设置在 semantic_text
字段上进行搜索,以方便使用。如果您想微调在 semantic_text
字段上的搜索,您需要知道 semantic_text
中配置的 inference_id
使用的任务类型。您可以使用获取推理 API找到任务类型,并检查与推理服务关联的 task_type
。根据 task_type
,使用 sparse_vector
或 knn
查询以获得更大的灵活性和自定义能力。
虽然可以在 semantic_text
字段上使用 sparse_vector
查询或 knn
查询,但不支持在 sparse_vector
或 dense_vector
字段类型上使用 semantic_query
。
使用 sparse_embedding
推理进行搜索
编辑当推理端点使用 sparse_embedding
模型时,您可以按以下方式在semantic_text
字段上使用 sparse_vector
查询
resp = client.search( index="test-index", query={ "nested": { "path": "inference_field.inference.chunks", "query": { "sparse_vector": { "field": "inference_field.inference.chunks.embeddings", "inference_id": "my-inference-id", "query": "mountain lake" } } } }, ) print(resp)
const response = await client.search({ index: "test-index", query: { nested: { path: "inference_field.inference.chunks", query: { sparse_vector: { field: "inference_field.inference.chunks.embeddings", inference_id: "my-inference-id", query: "mountain lake", }, }, }, }, }); console.log(response);
GET test-index/_search { "query": { "nested": { "path": "inference_field.inference.chunks", "query": { "sparse_vector": { "field": "inference_field.inference.chunks.embeddings", "inference_id": "my-inference-id", "query": "mountain lake" } } } } }
您可以自定义 sparse_vector
查询以包含特定设置,例如剪枝配置。
使用 text_embedding
推理进行搜索
编辑当推理端点使用 text_embedding
模型时,您可以按以下方式在 semantic_text
字段上使用 knn
查询
resp = client.search( index="test-index", query={ "nested": { "path": "inference_field.inference.chunks", "query": { "knn": { "field": "inference_field.inference.chunks.embeddings", "query_vector_builder": { "text_embedding": { "model_id": "my_inference_id", "model_text": "mountain lake" } } } } } }, ) print(resp)
const response = await client.search({ index: "test-index", query: { nested: { path: "inference_field.inference.chunks", query: { knn: { field: "inference_field.inference.chunks.embeddings", query_vector_builder: { text_embedding: { model_id: "my_inference_id", model_text: "mountain lake", }, }, }, }, }, }, }); console.log(response);
GET test-index/_search { "query": { "nested": { "path": "inference_field.inference.chunks", "query": { "knn": { "field": "inference_field.inference.chunks.embeddings", "query_vector_builder": { "text_embedding": { "model_id": "my_inference_id", "model_text": "mountain lake" } } } } } } }
您可以自定义 knn
查询以包含特定设置,例如 num_candidates
和 k
。