本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon OpenSearch Service 的 k-NN 短於其關聯的 K 最近鄰接演算法,可讓您搜尋向量空間中的點,並依歐克里代斯距離或餘弦相似性尋找這些點的「最近鄰接」。使用案例包括建議 (例如,音樂應用程式中「其他您可能喜歡的歌曲」功能)、影像辨識和詐騙偵測。
注意
本文件說明 OpenSearch Service 與各種 k-NN 外掛程式版本之間的相容性,以及搭配 受管 OpenSearch 服務使用外掛程式時的限制。如需 k-NN 外掛程式的完整文件,包括簡單和複雜的範例、參數參考和外掛程式的完整API參考,請參閱開放原始碼OpenSearch 文件
使用下表尋找在您的 Amazon OpenSearch Service 網域上執行的 k-NN 外掛程式版本。每個 k-NN 外掛程式版本對應至 OpenSearch
OpenSearch 版本 | k-NN 外掛程式版本 | 值得注意的功能 |
---|---|---|
2.13 | 2.13.0.0 | |
2.11 | 2.11.0.0 |
新增對 k-NN 查詢 |
2.9 | 2.9.0.0 | 使用 Faiss |
2.7 | 2.7.0.0 | |
2.5 | 2.5.0.0 | SystemIndexPlugin 已針對 k-NN 模型系統索引擴充 ,將 Lucene 特定的副檔名新增至核心 HybridFS |
2.3 | 2.3.0.0 | |
1.3 | 1.3.0.0 | |
1.2 | 1.2.0.0 | 新增對 Faiss |
1.1 | 1.1.0.0 | |
1.0 |
1.0.0.0 |
在支援回溯相容性RESTAPIs時重新命名,將命名空間從 重新命名opendistro 為 opensearch |
Elasticsearch 版本 | k-NN 外掛程式版本 | 值得注意的功能 |
---|---|---|
7.1 |
1.3.0.0 |
歐幾里德距離 |
7.4 |
1.4.0.0 |
|
7.7 |
1.8.0.0 |
餘弦相似度 |
7.8 |
1.9.0.0 |
|
7.9 |
1.11.0.0 |
暖機 API、自訂評分 |
7.10 |
1.13.0.0 |
漢明距離、L1 Norm 距離和 Painless 指令碼 |
k-NN 入門
若要使用 k-NN,您必須使用 index.knn
設定建立索引,並新增資料類型為 knn_vector
的一個或多個欄位。
PUT my-index
{
"settings": {
"index.knn": true
},
"mappings": {
"properties": {
"my_vector1
": {
"type": "knn_vector",
"dimension": 2
},
"my_vector2
": {
"type": "knn_vector",
"dimension": 4
}
}
}
}
knn_vector
資料類型支援最多 10,000 個浮點數的單一清單,其中包含由所需 dimension
參數定義的浮點數目。建立索引之後,將一些資料新增至其中。
POST _bulk
{ "index": { "_index": "my-index", "_id": "1" } }
{ "my_vector1": [1.5, 2.5], "price": 12.2 }
{ "index": { "_index": "my-index", "_id": "2" } }
{ "my_vector1": [2.5, 3.5], "price": 7.1 }
{ "index": { "_index": "my-index", "_id": "3" } }
{ "my_vector1": [3.5, 4.5], "price": 12.9 }
{ "index": { "_index": "my-index", "_id": "4" } }
{ "my_vector1": [5.5, 6.5], "price": 1.2 }
{ "index": { "_index": "my-index", "_id": "5" } }
{ "my_vector1": [4.5, 5.5], "price": 3.7 }
{ "index": { "_index": "my-index", "_id": "6" } }
{ "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 10.3 }
{ "index": { "_index": "my-index", "_id": "7" } }
{ "my_vector2": [2.5, 3.5, 5.6, 6.7], "price": 5.5 }
{ "index": { "_index": "my-index", "_id": "8" } }
{ "my_vector2": [4.5, 5.5, 6.7, 3.7], "price": 4.4 }
{ "index": { "_index": "my-index", "_id": "9" } }
{ "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 8.9 }
然後,您可以使用 knn
查詢類型搜尋資料。
GET my-index/_search
{
"size": 2,
"query": {
"knn": {
"my_vector2
": {
"vector": [2, 3, 5, 6],
"k": 2
}
}
}
}
在此情況下,k
是您想要查詢傳回的近鄰數目,但您亦須包含 size
選項。否則,您會獲得每個碎片 (和每個區段) 的 k
結果,而不是整個查詢的 k
結果。KNN 支援的最大 k
值為 10,000。
如果您將 knn
查詢與其他子句混合使用,則可能會收到少於 k
個的結果。在此範例中,post_filter
子句會將結果的數目從 2 減少為 1。
GET my-index/_search
{
"size": 2,
"query": {
"knn": {
"my_vector2
": {
"vector": [2, 3, 5, 6],
"k": 2
}
}
},
"post_filter": {
"range": {
"price
": {
"gte": 6,
"lte": 10
}
}
}
}
如果您需要在維持最佳效能的同時處理大量查詢,您可以使用 _msearch
GET _msearch
{ "index": "my-index"}
{ "query": { "knn": {"my_vector2":{"vector": [2, 3, 5, 6],"k":2 }} } }
{ "index": "my-index", "search_type": "dfs_query_then_fetch"}
{ "query": { "knn": {"my_vector1":{"vector": [2, 3],"k":2 }} } }
下列影片示範如何設定大量向量搜尋 K-NN 查詢。
k-NN 差異、調校和限制
OpenSearch 可讓您使用 修改所有 k-NN 設定_cluster/settings
在 OpenSearch 服務上,您可以變更 knn.memory.circuit_breaker.enabled
和 以外的所有設定knn.circuit_breaker.triggered
。k-NN 統計資料會納入為 Amazon CloudWatch 指標。
特別是,根據knn.memory.circuit_breaker.limit
統計資料和RAM執行個體類型的可用 KNNGraphMemoryUsage
檢查每個資料節點上的指標。 OpenSearch Service 會使用執行個體的一半RAM用於 Java 堆積 (堆積大小上限為 32 GiB)。根據預設,k-NN 最多會使用剩餘半數的 50%,因此具有 32 GiB 的執行個體類型RAM可以容納 8 GiB 的圖形 (32 * 0.5 * 0.5)。如果圖形記憶體用量超過此值,效能可能會受到影響。
您可以將在 2.x 版或更新版本上建立的 k-NN 索引遷移至 2.17 版或更新版本的網域上UltraWarm或冷儲存。
清除快取 API 和 k-NN 索引的暖索引會封鎖。當索引啟動第一個查詢時,它會從 Amazon S3 下載圖形檔案,並將圖形載入記憶體。同樣地,當圖形TTL過期時,檔案會自動從記憶體中移出。