Link Search Menu Expand Document Documentation Menu

k-NN 查询

使用 knn 查询在向量字段上运行最近邻搜索。

请求正文字段

knn 查询中提供向量字段并在向量字段对象中指定额外的请求字段

"knn": {
  "<vector_field>": {
    "vector": [<vector_values>],
    "k": <k_value>,
    ...
  }
}

顶级 vector_field 指定了用于运行搜索查询的向量字段。下表列出了所有支持的请求字段。

字段 数据类型 必需/可选 描述
vector 浮点或字节数组 必需 用于向量搜索的查询向量。向量元素的类型必须与所搜索的 knn_vector 字段中索引的向量类型匹配。
k 整数 可选 要返回的最近邻居数量。有效值范围是 [1, 10,000]。如果未指定 max_distancemin_score,则此项为必填项。
max_distance 浮点型 可选 搜索结果的最大距离阈值。只能指定 kmax_distancemin_score 中的一个。欲了解更多信息,请参阅 径向搜索
min_score 浮点型 可选 搜索结果的最小分数阈值。只能指定 kmax_distancemin_score 中的一个。欲了解更多信息,请参阅 径向搜索
filter 对象 可选 应用于 k-NN 搜索的过滤器。欲了解更多信息,请参阅 带过滤器的向量搜索重要:过滤器只能与 faisslucene 引擎一起使用。
method_parameters 对象 可选 用于微调搜索的额外参数
- ef_search(整数):要检查的向量数量(适用于 hnsw 方法)
- nprobes(整数):要检查的桶数量(适用于 ivf 方法)。欲了解更多信息,请参阅 在查询中指定方法参数
rescore 对象或布尔值 可选 用于配置重排序功能的参数
- oversample_factor(浮点):控制在重排序之前检索的候选向量数量。有效值范围是 [1.0, 100.0]。对于 in_memory 模式的字段(无重排序),默认值为 false;对于 on_disk 模式的字段,默认启用(具有动态值)。在 on_disk 模式下,默认的 oversample_factorcompression_level 决定。欲了解更多信息,请参阅压缩级别表。要显式启用默认 oversample_factor1.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 的信息。

当搜索使用 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。如果同时提供 kef_search,则将较大的值传递给引擎。如果 ef_search 大于 k,您可以提供 size 参数将最终结果数量限制为 k

nprobes

当搜索使用 ivf 方法创建的索引时,您可以提供 nprobes 参数。nprobes 参数指定了要检查的桶数量,以找到前 k 个最近邻居。nprobes 值越高,召回率越高,但搜索延迟也会增加。该值必须为正数。

下表提供了有关支持引擎的 nprobes 参数的信息。

引擎 备注
faiss 如果查询中存在 nprobes,它将覆盖创建索引时提供的值。

结果重排序

您可以通过提供 ef_searchoversample_factor 参数来微调搜索。

oversample_factor 参数控制搜索在对候选向量进行排序之前,对这些向量进行过采样时的倍数。使用更高的过采样因子意味着在排序阶段会考虑更多的候选,从而提高准确性,但也会增加搜索时间。在选择 oversample_factor 值时,请权衡准确性和效率。例如,将 oversample_factor 设置为 2.0 将使排序阶段考虑的候选数量加倍,这可能有助于获得更好的结果。

以下请求指定了 ef_searchoversample_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
        }
      }
    }
  }
}

后续步骤


相关文章