前提條件
- 已經參考向量檢索的集群規劃完成集群創建,集群必須是7.6.2或7.10.2版本。
- 根據實際需要參考本章節下方“集群高級配置”完成集群高級設置。
創建向量索引
1.登錄云搜索服務管理控制臺。
2.在“集群管理”頁面,選擇需要啟用向量檢索的集群,單擊操作列“Kibana”,登錄Kibana界面。
3.單擊左側導航欄的“Dev Tools”,執行如下命令創建向量索引。
創建一個名為“my_index”的索引,該索引包含一個名為“my_vector”的向量字段和一個名為“my_label”的文本字段。其中,向量字段創建了GRAPH圖索引,并使用歐式距離作為相似度度量。
PUT my_index
{
"settings": {
"index": {
"vector": true
}
},
"mappings": {
"properties": {
"my_vector": {
"type": "vector",
"dimension": 2,
"indexing": true,
"algorithm": "GRAPH",
"metric": "euclidean"
},
"my_label": {
"type": "text"
}
}
}
}
創建索引參數說明
類型 參數 說明 Index settings參數
vector
當需要使用向量索引加速時,需要設置該值為true。
Field mappings參數
type
字段類型,“vector”表示該字段為向量字段。
dimension
向量數據維度。
取值范圍:[1, ? 4096]
indexing
是否開啟向量索引加速。
可選值:
l? ? false:表示關閉向量索引加速,向量數據僅寫入docvalues,只支持使用ScriptScore以及Rescore進行向量查詢。
l? ? true:表示開啟向量索引加速,系統將創建額外的向量索引,索引算法由"algorithm"字段指定,寫入數據后可以使用VectorQuery進行查詢。
默認值:false。
algorithm
索引算法。僅當“indexing”為“true”時生效。
可選值:
l? ? FLAT:暴力計算,目標向量依次和所有向量進行距離計算,此方法計算量大,召回率100%。適用于對召回準確率要求極高的場景。
l? ? GRAPH:圖索引,內嵌深度優化的HNSW算法,主要應用在對性能和精度均有較高要求且單shard中文檔數量在千萬個以內的場景。
l? ? GRAPH_PQ:將HNSW算法與PQ算法進行了結合,通過PQ降低原始向量的存儲開銷,能夠使HNSW輕松支撐上億規模的檢索場景。
l? ? IVF_GRAPH:算法將IVF與HNSW結合,對全量空間進行劃分,每一個聚類中心向量代表了一個子空間,極大地提升檢索效率,同時會帶來微小的檢索精度損失。適用于數據量在上億以上同時對檢索性能要求較高的場景。
l? ? IVF_GRAPH_PQ:PQ算法與IVF-HNSW的結合,PQ可以通過配置選擇與HNSW結合和IVF結合,進一步提升系統的容量并降低系統開銷,適用于shard中文檔數量在十億級別以上同時對檢索性能要求較高的場景。
默認值:GRAPH。
說明
當選擇IVF_GRAPH或者IVF_GRAPH_PQ索引時,需要額外進行預構建中心點索引以及注冊等步驟,具體內容請參考?(可選)預構建與注冊。
見下表“可選參數說明”
當使用向量索引加速時(即“indexing”為“true”時),為了獲得更高的查詢性能以及查詢精度,ES提供了與向量索引相關的可選參數配置。
metric
計算向量之間距離的度量方式。
可選值:
l? ? euclidean:歐式距離。
l? ? inner_product:內積距離。
l? ? cosine:余弦距離。
l? ? hamming:漢明距離。
默認值:euclidean
可選參數說明
類型 參數 說明 GRAPH類索引配置參數
neighbors 圖索引中每個向量的鄰居數,默認值為64,值越大查詢精度越高。索引越大,構建速度以及后續的查詢速度也會變慢。
取值范圍:[10, ? 255]
shrink
構建hnsw時的裁邊系數,默認值1.0f。
取值范圍:(0.1, ? 10)
scaling
構建hnsw時上層圖節點數的縮放比例,默認值50。
取值范圍:(0, ? 128]
efc
構建hnsw時考察鄰居節點的隊列大小,默認值為200,值越大精度越高,構建速度將會變慢。
取值范圍:(0, ? 100000]
max_scan_num
掃描節點上限,默認值為10000,值越大精度越高,索引速度變慢。
取值范圍:(0, 1000000]
PQ類索引配置參數
centroid_num
每一段的聚類中心點數目,默認值為255。
取值范圍:(0, ? 65535]
fragment_num
段數,默認值為0,插件自動根據向量長度設置合適的段數。
取值范圍:[0, ? 4096]
導入向量數據
執行如下命令,導入向量數據。向“my_index”索引中寫入向量數據時,需要指定向量字段名稱和向量數據。
- 向量數據輸入格式為逗號分隔的浮點型數組時:
POST my_index/_doc
{
"my_vector": [1.0, 2.0]
}
- 向量數據輸入格式為小端字節序編碼的Base64字符串時:
在向量維度較高、數值有效位較多時,使用Base64編碼格式傳輸、解析更加高效。
POST my_index/_doc
{
"my_vector": "AACAPwAAAEA="
}
- 當寫入大規模數據時,建議使用Bulk操作:
POST my_index/_bulk
{"index": {}}
{"my_vector": [1.0, 2.0], "my_label": "red"}
{"index": {}}
{"my_vector": [2.0, 2.0], "my_label": "green"}
{"index": {}}
{"my_vector": [2.0, 3.0], "my_label": "red"}
集群高級配置
- 在離線導入數據場景下,為了提高批量寫入性能,建議將索引的refresh_interval參數設置為-1,即關閉自動刷新索引。
- 建議將備份數number_of_replicas設置為0,當離線數據導入完成后,再設置為需要的值。
- 其他高級功能的參數配置說明:
| 參數 | 說明 |
|---|---|
| native.cache.circuit_breaker.enabled | 是否開啟堆外內存熔斷。 默認值:true |
| native.cache.circuit_breaker.cpu.limit | 向量索引堆外內存使用上限。 假設使用128GB內存的機器且堆內存大小為31GB,默認堆外內存使用上限為(128 - 31) * 45% = 43.65GB,堆外內存使用量超過該值將會觸發寫入熔斷。 默認值:45% |
| native.cache.expire.enabled | 是否開啟緩存超時設置。開啟時,如果某些緩存項長時間沒有被訪問過將會被清除。 取值范圍:true、false 默認值:false |
| native.cache.expire.time | 超時時長。 默認值:24h |
| native.vector.index_threads | 創建底層索引時所使用的線程數,每個shard均會使用多個構建線程。該值建議不要設置過大,避免產生過多的構建線程搶占查詢資源。 默認值:4 |