更新时间:2025-07-29 GMT+08:00

进行向量检索

CSS向量数据库提供了强大的向量检索功能,支持多种查询方式,包括标准查询、复合查询、ScriptScore查询、重打分查询和Painless语法扩展查询。通过这些查询方式,用户可以高效地检索向量数据,满足不同场景下的搜索需求。
  • 标准查询:用于检索与查询向量最相似的文档。
  • 复合查询:允许将向量检索与其他Elasticsearch查询组合使用,包括前置过滤查询和布尔查询。
  • ScriptScore查询:允许使用自定义脚本计算向量相似度。
  • 重打分查询:用于对初始查询结果进行精排,提升召回率。
  • Painless语法扩展查询:允许在自定义脚本中使用向量距离计算函数。

标准查询

标准查询用于检索与查询向量最相似的文档。

下述查询命令将会返回所有数据中与查询向量最相似的size(topk)条数据。

POST my_index/_search
{
  "size":2,
  "_source": false, 
  "query": {
    "vector": {
      "my_vector": {
        "vector": [1, 1],
        "topk":2
      }
    }
  }
}
表1 标准查询的参数说明

参数

是否必选

参数类型

描述

size

Integer

指定搜索结果返回的数量。

默认值:10

_source

Boolean

是否返回文档的源数据。用于减少传输数据量,提升查询性能。

取值范围:
  • true(默认值):返回源字段数据。
  • false:不返回源字段数据。

query

Map

查询参数定义。

键值对说明:

vector(必填):指定查询类型为向量查询,标识查询请求为VectorQuery(向量相似度搜索),包含向量字段和查询向量值。

my_vector(必填):向量字段配置,指定用于查询的向量字段名称(如“my_vector”)。

vector(子参数)

Array/String

指定用于查询的向量值。用于计算查询向量与索引向量的相似度。

支持数组形式(如 [1, 1])或Base64编码形式(如 “AAABAAACAAAD”)。

topk

Integer

指定返回的最相似结果数量。表示要检索的Top K相似度最高的结果数量。

默认值:通常与“size”参数保持一致。

ef

Integer

控制图索引(如GRAPH类)查询时考察的邻居节点的队列大小。值越大,查询精度越高,但查询速度会变慢。

仅当索引的算法类型是GRAPH类时,即索引配置的“algorithm”为GRAPH、GRAPH_PQ、GRAPH_SQ8或GRAPH_SQ4时,才生效。

取值范围:0~100000。

默认值:200

max_scan_num

Integer

控制图索引(如GRAPH类)查询时扫描的最大节点数。值越大,精度越高,但查询速度会变慢。

仅当索引的算法类型是GRAPH类时,即索引配置的“algorithm”为GRAPH、GRAPH_PQ、GRAPH_SQ8或GRAPH_SQ4时,才生效。

取值范围:0~1000000

默认值:10000

nprobe

Integer

控制IVF类索引查询时考察的中心点数量。值越大,检索精度越高,但查询速度会变慢。

仅当索引的算法类型是IVF类时,即索引配置的“algorithm”为IVF_GRAPH或IVF_GRAPH_PQ时,才生效。

取值范围:0~100000

默认值:100

复合查询

复合查询允许将向量检索与其他Elasticsearch查询组合使用,包括前置过滤查询和布尔查询。

前置过滤查询仅Elasticsearch 7.10.2版本的集群支持。

以下示例的查询场景:查询Top10条“my_label”的值为“red”的结果。

  • 前置过滤查询

    先执行过滤条件检索,筛选出符合条件的结果,再对筛选结果进行向量相似度检索,以找出最相似的结果。

    查询示例如下:
    POST my_index/_search
    {
      "size": 10,
      "query": {
        "vector": {
          "my_vector": {
            "vector": [1, 2],
            "topk": 10,
            "filter": {
              "term": { "my_label": "red" }
            }
          }
        }
      }
    }
    表2 过滤查询的参数说明

    参数

    是否必选

    参数类型

    描述

    filter

    Map

    向量查询的过滤条件。支持Elasticsearch标准查询语法,如term、range等。

    如果“filter”过滤条件非常强,过滤后的中间结果集较小,则可以通过给向量索引配置“index.vector.exact_search_threshold”参数,当过滤后的结果集数量低于阈值时,系统会自动切换为暴力搜索(FLAT算法),以确保较高的召回率。配置操作请参见创建向量索引

    term

    Map

    term查询,是一种精确查询类型,用于精确匹配字段值。例如 “{"term": {"my_label": "red"}} ”表示只返回“my_label”字段值为“red”的文档。

  • 布尔查询

    布尔查询实际上是后置过滤查询方式。过滤条件与向量相似度检索分别独立执行,执行完成后对两者的检索结果进行布尔逻辑合并,合并逻辑由must、should、filter等谓词决定。

    查询示例如下:
    POST my_index/_search
    {
      "size": 10,
      "query": {
        "bool": {
          "must": {
            "vector": {
              "my_vector": {
                "vector": [1, 2],
                "topk": 10
              }
            }
          },
          "filter": {
            "term": { "my_label": "red" }
          }
        }
      }
    }
    表3 布尔查询的参数说明

    参数

    是否必选

    参数类型

    描述

    bool

    Map

    布尔查询的根查询类型,用于组合多个查询条件。

    键值对含义:
    • must:必须满足的条件。
    • filter:用于过滤的条件,不影响评分。
    • should:可选条件,满足越多越好。
    • must_not:必须不满足的条件。

    bool.must

    Map

    指定查询必须满足的条件,即查询结果必须同时满足这些条件。键值对含义:
    • vector:向量查询条件。
    • my_vector:指定向量字段名。
    • topk:返回的最相似结果数量。

    bool.filter

    Map

    向量查询的过滤条件,用于过滤文档但不影响评分。支持Elasticsearch标准查询语法,如term、range等。

ScriptScore查询

ScriptScore查询允许使用自定义脚本计算向量相似度。查询语法如下:

前置过滤条件可以为任意查询,script_score仅针对前置过滤的结果进行遍历,计算向量相似度并排序返回。此种查询方式不使用向量索引算法,性能取决于前置过滤后中间结果集的大小,当前置过滤条件为"match_all"时,相当于全局暴力检索。

查询示例如下:

POST my_index/_search 
 { 
   "size":2, 
   "query": { 
   "script_score": { 
       "query": { 
         "match_all": {} 
       }, 
       "script": { 
         "source": "vector_score", 
         "lang": "vector", 
         "params": { 
           "field": "my_vector", 
           "vector": [1.0, 2.0], 
           "metric": "euclidean" 
         } 
       } 
     } 
   } 
 }
表4 script_score参数说明

参数

是否必选

参数类型

描述

script_score

Map

ScriptScore查询根参数。

键值对说明:
  • query:前置过滤条件。当前置过滤条件为“match_all”时,相当于全局暴力检索。
  • script:脚本计算逻辑。

source

String

script脚本名称,固定值“vector_score”,使用内置的向量相似度计算脚本。

lang

String

script脚本语言类型,固定值“vector”,使用向量计算专用语言。

field

String

向量字段配置,指定用于查询的向量字段名称(如“my_vector”)。

vector

Array/String

指定用于查询的向量值。用于计算查询向量与索引向量的相似度。

支持数组形式(如 [1, 1])或Base64编码形式(如 “AAABAAACAAAD”)。

metric

String

向量距离度量方式。定义向量之间相似度或距离的计算方法。

取值范围:

  • euclidean(默认值):欧式距离。
  • inner_product:内积距离。
  • cosine:余弦距离。
  • hamming:汉明距离,仅支持向量索引的“dim_type”“binary”时使用。

重打分查询

重打分查询用于对初始查询结果进行精排,提升召回率。

当使用GRAPH_PQ索引或者IVF_GRAPH_PQ索引时,查询结果是根据PQ计算的非对称距离进行排序,通过Rescore方式可以对查询结果进行重打分精排。

假设my_index是PQ类型的索引,重打分查询示例如下:

GET my_index/_search 
 { 
   "size": 10, 
   "query": { 
     "vector": { 
       "my_vector": { 
         "vector": [1.0, 2.0], 
         "topk": 100 
       } 
     } 
   }, 
   "rescore": { 
     "window_size": 100, 
     "vector_rescore": { 
       "field": "my_vector", 
       "vector": [1.0, 2.0], 
       "metric": "euclidean" 
     } 
   } 
 }
表5 重打分的参数说明

参数

是否必选

参数类型

描述

rescore

Map

重打分参数定义。

键值对说明:
  • window_size:精排窗口大小。
  • vector_rescore:向量重打分配置。

window_size

Integer

精排窗口大小。向量检索将返回topk条结果,仅对前window_size条结果进行重打分精排。值越大,精排范围越广,召回率越高,但计算开销越大。

默认值:100

field

String

向量字段配置,指定用于查询的向量字段名称(如“my_vector”)。

vector

Array/String

指定用于查询的向量值。用于计算查询向量与索引向量的相似度。

支持数组形式(如 [1, 1])或Base64编码形式(如 “AAABAAACAAAD”)。

metric

String

向量距离度量方式。定义向量之间相似度或距离的计算方法。

取值范围:

  • euclidean(默认值):欧式距离。
  • inner_product:内积距离。
  • cosine:余弦距离。
  • hamming:汉明距离,仅支持向量索引的“dim_type”“binary”时使用。

Painless语法扩展查询

Painless语法扩展允许在自定义脚本中使用向量距离计算函数。CSS服务扩展实现了多种向量距离计算函数,可在自定义的Painless脚本中直接使用,用以构建灵活的重打分公式。

查询示例如下:

POST my_index/_search
{
  "size": 10,
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "1 / (1 + euclidean(params.vector, doc[params.field]))",
        "params": {
          "field": "my_vector",
          "vector": [1, 2]
        }
      }
    }
  }
}
表6 支持的距离计算函数

函数签名

说明

euclidean(Float[], DocValues)

欧式距离函数。

cosine(Float[], DocValues)

余弦相似度函数。

innerproduct(Float[], DocValues)

内积函数。

hamming(String, DocValues)

汉明距离函数。只支持“dim_type”“binary”的向量字段,输入的查询向量需要为Base64编码字符串格式。