语义查询

编辑

此功能处于 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_textsemantic 查询进行语义搜索的更多信息。

使用 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_vectorknn 查询以获得更大的灵活性和自定义能力。

虽然可以在 semantic_text 字段上使用 sparse_vector 查询或 knn 查询,但不支持在 sparse_vectordense_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_candidatesk