进行向量检索
- 标准查询:用于检索与查询向量最相似的文档。
- 复合查询:允许将向量检索与其他Elasticsearch查询组合使用,包括前置过滤查询和布尔查询。
- ScriptScore查询:允许使用自定义脚本计算向量相似度。
- 重打分查询:用于对初始查询结果进行精排,提升召回率。
- Painless语法扩展查询:允许在自定义脚本中使用向量距离计算函数。
标准查询
标准查询用于检索与查询向量最相似的文档。
下述查询命令将会返回所有数据中与查询向量最相似的size(topk)条数据。
POST my_index/_search
{
"size":2,
"_source": false,
"query": {
"vector": {
"my_vector": {
"vector": [1, 1],
"topk":2
}
}
}
}
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
size |
是 |
Integer |
指定搜索结果返回的数量。 默认值:10 |
_source |
否 |
Boolean |
是否返回文档的源数据。用于减少传输数据量,提升查询性能。
取值范围:
|
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"
}
}
}
}
}
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
script_score |
是 |
Map |
ScriptScore查询根参数。
键值对说明:
|
source |
是 |
String |
script脚本名称,固定值“vector_score”,使用内置的向量相似度计算脚本。 |
lang |
是 |
String |
script脚本语言类型,固定值“vector”,使用向量计算专用语言。 |
field |
是 |
String |
向量字段配置,指定用于查询的向量字段名称(如“my_vector”)。 |
vector |
是 |
Array/String |
指定用于查询的向量值。用于计算查询向量与索引向量的相似度。 支持数组形式(如 [1, 1])或Base64编码形式(如 “AAABAAACAAAD”)。 |
metric |
是 |
String |
向量距离度量方式。定义向量之间相似度或距离的计算方法。 取值范围:
|
重打分查询
重打分查询用于对初始查询结果进行精排,提升召回率。
当使用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"
}
}
}
参数 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
rescore |
是 |
Map |
重打分参数定义。
键值对说明:
|
window_size |
是 |
Integer |
精排窗口大小。向量检索将返回topk条结果,仅对前window_size条结果进行重打分精排。值越大,精排范围越广,召回率越高,但计算开销越大。 默认值:100 |
field |
是 |
String |
向量字段配置,指定用于查询的向量字段名称(如“my_vector”)。 |
vector |
是 |
Array/String |
指定用于查询的向量值。用于计算查询向量与索引向量的相似度。 支持数组形式(如 [1, 1])或Base64编码形式(如 “AAABAAACAAAD”)。 |
metric |
是 |
String |
向量距离度量方式。定义向量之间相似度或距离的计算方法。 取值范围:
|
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]
}
}
}
}
}
函数签名 |
说明 |
---|---|
euclidean(Float[], DocValues) |
欧式距离函数。 |
cosine(Float[], DocValues) |
余弦相似度函数。 |
innerproduct(Float[], DocValues) |
内积函数。 |
hamming(String, DocValues) |
汉明距离函数。只支持“dim_type”为“binary”的向量字段,输入的查询向量需要为Base64编码字符串格式。 |