k-NN 查询
使用 knn
查询在向量字段上运行最近邻搜索。
请求正文字段
在 knn
查询中提供向量字段并在向量字段对象中指定额外的请求字段
"knn": {
"<vector_field>": {
"vector": [<vector_values>],
"k": <k_value>,
...
}
}
顶级 vector_field
指定了用于运行搜索查询的向量字段。下表列出了所有支持的请求字段。
字段 | 数据类型 | 必需/可选 | 描述 |
---|---|---|---|
vector | 浮点或字节数组 | 必需 | 用于向量搜索的查询向量。向量元素的类型必须与所搜索的 knn_vector 字段中索引的向量类型匹配。 |
k | 整数 | 可选 | 要返回的最近邻居数量。有效值范围是 [1, 10,000]。如果未指定 max_distance 或 min_score ,则此项为必填项。 |
max_distance | 浮点型 | 可选 | 搜索结果的最大距离阈值。只能指定 k 、max_distance 或 min_score 中的一个。欲了解更多信息,请参阅 径向搜索。 |
min_score | 浮点型 | 可选 | 搜索结果的最小分数阈值。只能指定 k 、max_distance 或 min_score 中的一个。欲了解更多信息,请参阅 径向搜索。 |
filter | 对象 | 可选 | 应用于 k-NN 搜索的过滤器。欲了解更多信息,请参阅 带过滤器的向量搜索。重要:过滤器只能与 faiss 或 lucene 引擎一起使用。 |
method_parameters | 对象 | 可选 | 用于微调搜索的额外参数 - ef_search (整数):要检查的向量数量(适用于 hnsw 方法)- nprobes (整数):要检查的桶数量(适用于 ivf 方法)。欲了解更多信息,请参阅 在查询中指定方法参数。 |
rescore | 对象或布尔值 | 可选 | 用于配置重排序功能的参数 - oversample_factor (浮点):控制在重排序之前检索的候选向量数量。有效值范围是 [1.0, 100.0] 。对于 in_memory 模式的字段(无重排序),默认值为 false ;对于 on_disk 模式的字段,默认启用(具有动态值)。在 on_disk 模式下,默认的 oversample_factor 由 compression_level 决定。欲了解更多信息,请参阅压缩级别表。要显式启用默认 oversample_factor 为 1.0 的重排序,请将 rescore 设置为 true 。欲了解更多信息,请参阅 重排序结果。 |
expand_nested_docs | 布尔型 | 可选 | 当为 true 时,检索每个父文档中所有嵌套字段文档的分数。与嵌套查询一起使用。欲了解更多信息,请参阅 带嵌套字段的向量搜索。 |
请求示例
GET /my-vector-index/_search
{
"query": {
"knn": {
"my_vector": {
"vector": [1.5, 2.5],
"k": 3
}
}
}
}
请求示例:嵌套字段
GET /my-vector-index/_search
{
"_source": false,
"query": {
"nested": {
"path": "nested_field",
"query": {
"knn": {
"nested_field.my_vector": {
"vector": [1,1,1],
"k": 2,
"expand_nested_docs": true
}
}
},
"inner_hits": {
"_source": false,
"fields":["nested_field.color"]
},
"score_mode": "max"
}
}
}
请求示例:使用 max_distance 进行径向搜索
以下示例展示了使用 max_distance
执行的径向搜索
GET /my-vector-index/_search
{
"query": {
"knn": {
"my_vector": {
"vector": [
7.1,
8.3
],
"max_distance": 2
}
}
}
}
请求示例:使用 min_score 进行径向搜索
以下示例展示了使用 min_score
执行的径向搜索
GET /my-vector-index/_search
{
"query": {
"knn": {
"my_vector": {
"vector": [7.1, 8.3],
"min_score": 0.95
}
}
}
}
在查询中指定方法参数
从 2.16 版本开始,您可以在搜索请求中提供 method_parameters
GET /my-vector-index/_search
{
"size": 2,
"query": {
"knn": {
"target-field": {
"vector": [2, 3, 5, 6],
"k": 2,
"method_parameters" : {
"ef_search": 100
}
}
}
}
}
这些参数取决于用于创建索引的引擎和方法的组合。以下部分提供了有关支持的 method_parameters
的信息。
ef_search
当搜索使用 hnsw
方法创建的索引时,您可以提供 ef_search
参数。ef_search
参数指定了要检查的向量数量,以找到前 k 个最近邻居。ef_search
值越高,召回率越高,但搜索延迟也会增加。该值必须为正数。
下表提供了有关支持引擎的 ef_search
参数的信息。
引擎 | 径向查询支持 | 备注 |
---|---|---|
nmslib (已弃用) | 否 | 如果查询中存在 ef_search ,它将覆盖 index.knn.algo_param.ef_search 索引设置。 |
faiss | 是 | 如果查询中存在 ef_search ,它将覆盖 index.knn.algo_param.ef_search 索引设置。 |
lucene | 否 | 创建搜索查询时,必须指定 k 。如果同时提供 k 和 ef_search ,则将较大的值传递给引擎。如果 ef_search 大于 k ,您可以提供 size 参数将最终结果数量限制为 k 。 |
nprobes
当搜索使用 ivf
方法创建的索引时,您可以提供 nprobes
参数。nprobes
参数指定了要检查的桶数量,以找到前 k 个最近邻居。nprobes
值越高,召回率越高,但搜索延迟也会增加。该值必须为正数。
下表提供了有关支持引擎的 nprobes
参数的信息。
引擎 | 备注 |
---|---|
faiss | 如果查询中存在 nprobes ,它将覆盖创建索引时提供的值。 |
结果重排序
您可以通过提供 ef_search
和 oversample_factor
参数来微调搜索。
oversample_factor
参数控制搜索在对候选向量进行排序之前,对这些向量进行过采样时的倍数。使用更高的过采样因子意味着在排序阶段会考虑更多的候选,从而提高准确性,但也会增加搜索时间。在选择 oversample_factor
值时,请权衡准确性和效率。例如,将 oversample_factor
设置为 2.0
将使排序阶段考虑的候选数量加倍,这可能有助于获得更好的结果。
以下请求指定了 ef_search
和 oversample_factor
参数
GET /my-vector-index/_search
{
"size": 2,
"query": {
"knn": {
"my_vector_field": {
"vector": [1.5, 5.5, 1.5, 5.5, 1.5, 5.5, 1.5, 5.5],
"k": 10,
"method_parameters": {
"ef_search": 10
},
"rescore": {
"oversample_factor": 10.0
}
}
}
}
}