Elasticsearch向量引擎功能,用於處理大規模的向量資料。它結合了Elasticsearch的強大搜尋功能和向量相似性計算能力,適用於推薦系統、映像檢索、自然語言處理等情境。本文將介紹如何高效地使用Elasticsearch向量引擎,並為您提供一些最佳實務建議。Elasticsearch的向量引擎正在不斷迭代,因此建議使用最新版本的Elasticsearch,以確保在效能、成本和使用者體驗方面獲得最佳效果。
前提條件
已建立ES執行個體,如您未建立執行個體,請參見初級版:從執行個體建立到資料檢索(建立阿里雲ES 8.x的最新版本)。
向量引擎需要大量堆外記憶體cache向量索引。在選擇規格時,可依據下文關於記憶體計算的說明,評估堆外記憶體的使用方式,從而選擇合適的資料節點規格及其數量。
操作指引
1.建立索引
建立一個適合儲存向量資料的索引是首要步驟。以下是一個樣本索引定義:
PUT /my_vector_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"my_vector": {
"type": "dense_vector",
"dims": 3
},
"my_text" : {
"type" : "keyword"
}
}
}
}number_of_shards和number_of_replicas的設定取決於您的資料規模和效能需求。dense_vector類型用於儲存向量資料,dims參數指定了向量的維度。dense_vector的參數很多,具體請參見Dense vector field type。
2.資料匯入
您可以使用多種方式將資料匯入到Elasticsearch向量索引中,例如使用Bulk API大量匯入資料。以下是一個樣本:
PUT my_vector_index/_doc/1
{
"my_text" : "text1",
"my_vector" : [0.5, 10, 6]
}
PUT my_vector_index/_doc/2
{
"my_text" : "text2",
"my_vector" : [-0.5, 10, 10]
}請確保向量資料的維度與索引定義中的維度一致。
3.向量搜尋
使用Elasticsearch的向量相似性搜尋功能,可以通過指定查詢向量來尋找最相似的文檔。以下是一個樣本查詢:
GET my_vector_index/_search
{
"knn": {
"field": "my_vector",
"query_vector": [-5, 9, -12],
"k": 10,
"num_candidates": 100
},
"fields": [ "my_text" ]
}參數 | 內容 |
| (可選)表示返回的最近鄰居的數量。該值必須小於或等於 |
| (可選)每個分區需考慮的最近鄰居候選數量。該參數對效能和召回率具有顯著影響, |
關於k和num_candidates參數的說明:num_candidates在HNSW中指的是查詢的ef值,它表示在分區中收集的最臨近的num_candidates個文檔,而k則是Elasticsearch最終在結果中返回的doc數量。
更多向量搜尋的功能包括:
knn可以支援filter查詢。可以支援similarity,設定最小score的命中doc。可以支援nested欄位。支援同時查詢多個
knn欄位。支援使用
script進行精確knn查詢。支援使用
script進行rescore。完整功能請參見k-nearest neighbor (knn) search。