在創建向量索引時,若選擇使用“IVF_GRAPH”和“IVF_GRAPH_PQ”的索引算法就需要對中心點向量進行預構建和注冊。
背景信息
在向量索引加速算法中,IVF_GRAPH和IVF_GRAPH_PQ適用于超大規模場景。這兩種算法需要通過對子空間的切割縮小查詢范圍,子空間的劃分通常采用聚類或者隨機采樣的方式。在預構建之前,需要通過聚類或者隨機采樣得到所有的中心點向量。
當完成生成中心點向量的工作之后,需要對中心點向量進行預構建和注冊,以實現將中心點向量預構建GRAPH或者GRAPH_PQ索引,同時注冊到ES集群內,實現在多個節點間共享此索引文件。中心點索引在shard間復用能夠有效減少訓練的開銷、中心點索引查詢次數,提升寫入以及查詢的性能。
操作步驟
1.選擇啟用向量檢索的集群,單擊操作列“Kibana”,登錄Kibana界面。
2.單擊左側導航欄的“Dev Tools”,進入操作界面。
3.創建中心點索引表。
?創建的索引命名為my_dict,注意該索引的number_of_shards數必須設置為1,否則無法注冊。
?當需要使用IVF_GRAPH索引時,中心點索引的algorithm設置為GRAPH。
?當需要使用IVF_GRAPH_PQ索引時,中心點索引的algorithm設置為GRAPH_PQ。
PUT my_dict
{
"settings": {
"index": {
"vector": true
},
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"my_vector": {
"type": "vector",
"dimension": 2,
"indexing": true,
"algorithm": "GRAPH",
"metric": "euclidean"
}
}
}
}
4.寫入中心點向量數據。
參考創建向量索引章節中的“導入向量數據”,將采樣或者聚類得到的中心點向量寫入上述創建的my_dict索引中。
5.調用注冊接口。
將上述創建的my_dict索引注冊具有全局唯一標識名稱(dict_name)的Dict對象。
PUT _vector/register/my_dict
{
"dict_name": "my_dict"
}
6.創建IVF_GRAPH或IVF_GRAPH_PQ索引。
在創建IVF_GRAPH或者IVF_GRAPH_PQ索引時,不再需要指定dimension以及metric信息,只需指定之前注冊好的dict名稱即可。
PUT my_index
{
"settings": {
"index": {
"vector": true
}
},
"mappings": {
"properties": {
"my_vector": {
"type": "vector",
"indexing": true,
"algorithm": "IVF_GRAPH",
"dict_name": "my_dict",
"offload_ivf": false
}
}
}
}
Field mappings參數
| 參數 | 說明 |
|---|---|
| dict_name | 指定依賴的中心點索引名稱。該索引字段的向量維度和度量方式將與dict索引保持一致,不再需要額外指定。 |
| offload_ivf | 將底層索引實現的IVF倒排索引卸載到ES端實現,可以減少堆外內存的使用,以及減少寫入/合并的性能開銷,但是查詢的性能也有一定的損失。采用默認值即可。 取值范圍:true、false。 默認值:false。 |