向量查詢
更新時間 2023-12-10 22:59:27
最近更新時間: 2023-12-10 22:59:27
分享文章
本章節主要介紹如何操作向量查詢。
標準查詢
針對創建了向量索引的向量字段,提供了標準向量查詢語法。下述查詢命令將會返回所有數據中與查詢向量最近的size(topk)條數據。
POST my_index/_search
{
"size":2,
"_source": false,
"query": {
"vector": {
"my_vector": {
"vector": [1, 1],
"topk":2
}
}
}
}
標準查詢的參數說明
| 參數 | 說明 |
|---|---|
| vector(第一個) | 表示該查詢類型為VectorQuery。 |
| my_vector | 指定了需要查詢的向量字段名稱。 |
| vector(第二個) | 指定查詢向量的具體值,支持數組形式以及Base64編碼形式的輸入。 |
| topk | topk的值通常與size保持一致。 |
| 下表“可選的查詢參數說明” | 通過調整不同索引的查詢參數,可以獲得更高的查詢性能或者查詢精度。 |
可選的查詢參數說明
參數 子參數 說明 GRAPH類索引配置參數
ef
查詢時考察鄰居節點的隊列大小。值越大查詢精度越高,查詢速度會變慢。默認值為200。
取值范圍:(0, ? 100000]
max_scan_num
掃描節點上限。值越大精度越高,查詢速度變慢。默認值為10000。
取值范圍:(0, ? 1000000]
IVF類索引配置參數
nprobe
查詢考察中心點的數目。值越大精度越高,查詢速度變慢。默認值為100。
取值范圍:(0, ? 100000]
復合查詢
向量檢索支持與其他ES子查詢組合進行復合查詢,比如布爾查詢、后置過濾等。
以下兩個示例的查詢結果:首先查詢top10條與查詢向量距離最近的結果,filter作為過濾條件將僅保留my_label字段為“red”的結果。
- 布爾查詢示例
POST my_index/_search
{
"size": 10,
"query": {
"bool": {
"must": {
"vector": {
"my_vector": {
"vector": [1, 2],
"topk": 10
}
}
},
"filter": {
"term": { "my_label": "red" }
}
}
}
}
- 后置過濾示例
GET my_index/_search
{
"size": 10,
"query": {
"vector": {
"my_vector": {
"vector": [1, 2],
"topk": 10
}
}
},
"post_filter": {
"term": { "my_label": "red" }
}
}
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參數說明
| 參數 | 說明 |
|---|---|
| source | script腳本描述,使用向量相似度打分時為固定值"vector_score"。 |
| lang | script語法描述,使用固定值"vector"。 |
| field | 向量字段名稱。 |
| vector | 查詢向量數據。 |
| metric | 度量方式,可選值為:euclidean、inner_product、cosine、hamming。 默認值:euclidean |
重打分查詢
當使用GRAPH_PQ索引或者IVF_GRAPH_PQ索引時,查詢結果是根據PQ計算的非對稱距離進行排序。ES支持Rescore的方式對查詢結果進行重打分精排,提升召回率。
假設my_index是PQ類型的索引,Rescore示例如下:
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參數說明
| 參數 | 說明 |
|---|---|
| window_size | 向量檢索將會返回topk條結果,僅取前window_size條結果精排。 |
| field | 向量字段名稱。 |
| vector | 查詢向量數據。 |
| metric | 度量方式,可選值為:euclidean、inner_product、cosine、hamming。 默認值:euclidean |