本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
KNN
适用于 的 KNN 是其关联的 k 最近邻Amazon Elasticsearch Service算法的缩写,可让您搜索向量空间中的点,并通过 Euclidean 距离或余弦相似性查找这些点的“最近邻”。使用案例包括推荐(例如,音乐应用程序中的“您可能喜欢的其他歌曲”功能)、图像识别和欺诈检测。
具有 Euclidean 距离的 KNN 需要 Elasticsearch 7.1 或更高版本。余弦相似性需要 Elasticsearch 7.7 或更高版本。
Open Distro for Elasticsearch 文档Elasticsearch中提供了 功能的完整文档,包括
KNN 入门
要使用 KNN,您必须使用 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 } } } }
KNN 差异和调整
Open Distro for Elasticsearch 可让您使用 API 修改所有 _cluster/settings
。在 Amazon ES 上,您可以更改除 knn.memory.circuit_breaker.enabled
和 knn.circuit_breaker.triggered
之外的所有设置。 KNN 统计数据作为 Amazon CloudWatch 指标包含在内。
具体而言,请根据 KNNGraphMemoryUsage
统计数据和实例类型的可用 RAM 检查每个数据节点的 knn.memory.circuit_breaker.limit
指标。Amazon ES 使用实例的一半 RAM 作为 Java 堆(最大堆大小为 32 GiB)。默认情况下,KNN 使用最多 60% 的剩余一半,因此具有 32
GiB RAM 的实例类型可以容纳 9.6 GiB 个图表 (32 * 0.5 * 0.6)。如果图形内存使用量超过此值,性能可能会受到影响。