elasticsearch 弹性KNN搜索候选数与分片大小

zazmityj  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(168)

我正在研究使用弹性KNN搜索功能,从我所看到的,这是我们如何查询ES的KNN搜索。

GET my-index/_knn_search
{
  "knn": {
    "field": "image_vector",
    "query_vector": [0.3, 0.1, 1.2],
    "k": 10,
    "num_candidates": 100
  },
  "_source": ["name", "file_type"]
}

这里num_candidates的最大限制为10000,从ES文档中我看到了-The number of nearest neighbor candidates to consider per shard. Cannot exceed 10,000. Elasticsearch collects num_candidates results from each shard, then merges them to find the top k results. Increasing num_candidates tends to improve the accuracy of the final k results.
上面的话我不是很清楚。以下是一些问题:
1.这10,000名候选人是如何选拔出来的?
1.如果我们有100万个矢量文档,要搜索所有这些文档,我们应该选择100个分片,这样每个分片最多有10 k个文档?我们需要非常好的回忆检索结果。
1.他们的documents在挑选分片策略上说,太多的小分片是不好的,他们有自己的开销。那么,当KNN的每个分片有10 k个候选者的限制时,我们如何选择分片大小?
我看到类似的问题here,但没有适当的答案。

qnakjoqk

qnakjoqk1#

你需要区分kNN(k最近邻)和精确搜索。
精确搜索(即通过使用script_score查询的蛮力搜索),如果您有1M个向量,则将您的查询向量与每个向量进行比较,并且您将获得的结果是与您的查询向量最接近的真实的10个向量。
使用kNN搜索,也称为近似最近邻(ANN),它有点不同,因为您的1M向量将根据您的向量搜索引擎(倒排文件索引,KD树,分层可导航小世界等)在专用结构中进行索引。对于基于Apache Lucene的Elasticsearch,向量在分层可导航小世界结构中索引。在搜索时,HNSW算法将尝试根据它们的最近距离或最高相似度来计算查询向量的k个最近邻居。它可能会找到真实的,也可能找不到,因此这些搜索算法具有近似的性质。为了减少“or not”的可能性,我们的想法是访问更多的向量,这就是num_candidates的作用。
我们的想法是不要选择一个足够高的num_candidates值来访问数据库中的所有向量,因为这将归结为进行精确搜索,使用ANN算法对此没有意义,只需运行精确搜索,支付执行价格,仅此而已。
您要查找的分片大小调整文档不适用于kNN搜索。kNN搜索有自己不同的tuning strategy。由于HNSW图需要按段构建,并且每个段都需要搜索,因此理想的情况是搜索单个段,即一个碎片和一个强制合并片段根据您的数据量,如果您不断索引新的向量,它可能不可行。但你应该在这个方向上优化,即。尽可能少的碎片和片段。
假设您设法将1M向量放入单个片段的单个分片中,那么没有理由使用高num_candidates,因为HNSW搜索算法具有相当好的召回率,并且不需要访问超过一定数量的候选者(根据您的用例,约束,数据量,SLA等来计算)以找到前k个。

相关问题