kNN 搜索 API

!> 此功能在技术预览版中,可能会在未来的版本中更改或删除。Elastic将尽最大努力解决任何问题,但技术预览中的功能不受正式 GA 功能的支持 SLA 的约束。

执行 k-最近邻(k-nearest neighbor,kNN)搜索并返回匹配的文档。

  1. GET my-index/_knn_search
  2. {
  3. "knn": {
  4. "field": "image_vector",
  5. "query_vector": [0.3, 0.1, 1.2],
  6. "k": 10,
  7. "num_candidates": 100
  8. },
  9. "_source": ["name", "date"]
  10. }

请求

GET <target>/_knn_search

POST <target>/_knn_search

前置条件

  • 如果 Elasticsearch 安全特性启用,你对目标数据流、索引或别名必须有索引权限

描述

kNN 搜索 API 在 dense_vector 字段上执行 k-最近邻(kNN)搜索。给定一个查询向量,它会找到 k 个最接近的向量,并将这些文档作为搜索结果返回。

Elasticsearch 使用 HNSW 算法来支持高效的 kNN 搜索。与大多数 kNN 算法一样,HNSW 是一种近似方法,它牺牲了结果的准确性以提高搜索速度。这意味着返回的结果并不总是真正的 k 近邻。

路径参数

  • <target> (可选,字符串)限制请求的逗号分隔的数据流、索引和别名的列表。支持通配符()。要以所有数据流和索引为目标,忽略此参数或使用 `_all`。

    !> kNN 搜索还不能处理过滤的别名。对过滤后的别名运行 kNN 搜索可能会错误地导致少于 k 次点击。

查询参数

  • routing (可选,字符串)用于路由操作到指定分片的自定义值。

请求体

  • knn (必需,对象)定义运行的 kNN 查询。

    • knn 对象属性

      • field (必需,字符串)要搜索的向量字段的名称。必须是启用索引的 dense_vector
      • query_vector (必需,浮点数组)查询向量。必须与要搜索的向量场具有相同的维数。
      • k (必需,整数)作为优先命中返回的最近邻居数。值必须小于 num_candidates
      • num_candidates (必需,整数)每个分片要考虑的最近邻候选数。不能超过 10,000。Elasticsearch 从每个分片中收集 num_candidates 个结果,然后合并它们以找到前 k 个结果。增加 num_candidates 往往会提高最终 k结果的准确性。
  • docvalue_fields (可选,字符串和对象数组)通配符(*)模式数组。该请求返回响应的 hits.fields 属性中与这些模式匹配的字段名的文档值。

    你可以在数组中指定字符串或对象。参阅文档值字段

    • docvalue_fields 对象属性

      • field (必需,字符串)通配符模式。请求返回与此模式匹配的字段名的文档值。
      • format (可选,字符串)返回文档值的格式。

        对于日期字段,你可以指定日期的日期格式。对于数字字段,你可以指定十进制模式

        对于其他字段数据类型,此参数不支持。

  • fields (可选,字符串和对象数组)通配符(*)模式数组。该请求返回响应的 hits.fields 属性中与这些模式匹配的字段名的文档值。

    你可以在数组中指定字符串或对象。

    • fields 对象属性

      • field (必需,字符串)返回的字段。支持通配符(*)。

      • format (可选,字符串)日期和地理空间字段的格式。其他字段数据类型不支持此参数。

        datedate_nanos 字段接受日期格式geo_pointgeo_shape 字段接受:

        • geojson(默认) GeoJSON
        • wkt Well Known Text/知名文本
        • mvt(<zoom>/<x>/<y>@<extent>) or mvt(<zoom>/<x>/<y>) 地图盒矢量块。此 API 返回的块是 base64 编码的字符串。

          • mvt 参数
            • <zoom> (必需,整数)块的缩放级别。支持 0-29
            • <x> (必需,整数)块的 X 坐标。
            • <y> (必需,整数)块的 Y 坐标。
            • <extent> (可选,整数)平铺一侧的大小(以像素为单位)。矢量平铺是等边的正方形。默认为 4,096
  • _source (可选)指示为匹配文档返回的源字段。这些字段将在搜索响应的属性 hits._source 中返回。默认为 true

    • _source 有效值

      • true (布尔值)全部文档源返回。

      • false (布尔值)文档源不返回。

      • <string> (字符串)逗号分隔的待返回的源字段列表。支持通配符(*)。

  • stored_fields (可选,字符串)以逗号分隔的存储字段列表,作为命中的一部分返回。如果未指定字段,则响应中不包括存储的字段。

    如果指定了此字段,则 _source 参数默认为 false。你可以传递 _source:true 以返回搜索响应中的源字段和存储字段。

响应体

kNN 搜索响应的结构与搜索 API 响应的结构完全相同。但是,某些部分对 kNN 搜索有特定的含义:

  • 文档 _score由查询和文档向量之间的相似性决定。参阅相似性

  • hits.total 对象包含考虑的最近邻候选总数,即 num_candidates * num_shardshits.total.relation 总是 eq,表示精确的值。

原文链接