模板查询
2.19 版本引入
模板查询允许您创建带有动态占位符的查询,这些占位符在查询执行期间由搜索请求处理器解析。当您的查询参数需要在搜索过程中生成或转换时,这特别有用,例如在使用机器学习 (ML) 推理将文本转换为向量嵌入时。
以下搜索实现可受益于使用模板查询:
- 将文本输入转换为向量嵌入以进行向量搜索
- 基于运行时计算的动态查询参数生成
- 需要中间处理的复杂查询转换
占位符使用 "${variable_name}"
语法定义(请注意,变量必须用引号括起来)。搜索请求处理器可以在查询处理之前生成或转换数据以填充这些占位符。模板查询充当最终可执行查询的容器。
示例
以下示例演示了如何将模板查询与用于语义搜索的 ml_inference
搜索请求处理器结合使用。
先决条件
在使用 ml_inference
搜索请求处理器之前,您必须配置一个 ML 模型。有关本地模型的更多信息,请参阅 在 OpenSearch 中使用机器学习模型。有关外部托管模型的更多信息,请参阅 连接到外部托管模型。
配置模型后,您可以通过发送预测 API 请求来测试模型
POST /_plugins/_ml/models/mBGzipQB2gmRjlv_dOoB/_predict
{
"parameters": {
"inputText": "happy moments"
}
}
响应包含一个 embedding
字段,其中包含从 inputText
生成的向量嵌入
{
"inference_results": [
{
"output": [
{
"name": "response",
"dataAsMap": {
"embedding": [
0.6328125,
0.26953125,
0.41796875,
-0.00579833984375,
1.859375,
0.2734375,
0.130859375,
-0.001007080078125,
0.138671875,
...],
"inputTextTokenCount": 2
}
}
],
"status_code": 200
}
]
}
步骤 1:创建摄入管道
创建摄入管道,以便在文档索引期间从文本字段生成向量嵌入。input_map
将文档字段映射到模型输入。在此示例中,文档中的 text
源字段映射到 inputText
字段,后者是模型的预期输入字段。output_map
将模型输出映射到文档字段。在此示例中,模型中的 embedding
输出字段映射到文档中的 text_embedding
目标字段。
PUT /_ingest/pipeline/knn_pipeline
{
"description": "knn_pipeline",
"processors": [
{
"ml_inference": {
"model_id": "Sz-wFZQBUpPSu0bsJTBG",
"input_map": [
{
"inputText": "text"
}
],
"output_map": [
{
"text_embedding": "embedding"
}
]
}
}
]
}
步骤 2:索引文档
将以下文档索引到 template-knn-1
索引中
PUT /template-knn-1/_doc/1
{
"text": "red shoes"
}
要查看文档,请发送 GET 请求
GET /template-knn-1/_doc/1
响应显示,模型生成的嵌入与原始 text
一起存储在 text_embedding
字段中。
{
"_index": "template-knn-1",
"_id": "1",
"_version": 2,
"_seq_no": 1,
"_primary_term": 1,
"found": true,
"_source": {
"text_embedding": [
-0.69140625,
0.8125,
0.51953125,
-0.7421875,
0.6875,
0.4765625,
-0.34375,
...],
"text": "red shoes"
}
}
步骤 3:使用模板查询进行搜索
使用以下模板查询搜索索引。ml_inference
处理器从输入文本 sneakers
生成向量嵌入,将 ${text_embedding}
替换为生成的向量,并搜索最接近该向量的文档。
GET /template-knn-1/_search?search_pipeline=my_knn_pipeline
{
"query": {
"template": {
"knn": {
"text_embedding": {
"vector": "${text_embedding}",
"k": 2
}
}
}
},
"ext": {
"ml_inference": {
"text": "sneakers"
}
}
}
响应包含匹配的文档
{
"took": 611,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.0019327316,
"hits": [
{
"_index": "template-knn-1",
"_id": "1",
"_score": 0.0019327316,
"_source": {
"text_embedding": [
-0.69140625,
0.8125,
0.51953125,
..],
"text": "red shoes"
}
}
]
}
}