我试图理解在弹性搜索中使用 KNN 搜索时的“num_candidates”参数。
阅读我将在最后列出的一些帖子/文档时,我了解到 ES 从每个分片中选择“num_candidates”文档,然后从“num_candidates”所选文档中选择“k”个文档。
我的问题是,那些“num_candidates”文档是如何选择的?我找到了这个答案,但我不明白“如何”。
“num_candidates 与 efSearch 的想法相同。它是我们在搜索每个分片的 HNSW 图时继续跟踪的候选者数量。”
我担心的是 KNN 是否不评估索引中的所有文档。
我当前的问题是,执行 knn 搜索时,我每次都会得到不同的结果,而搜索之间的索引没有变化。
谢谢你。
相关文档:
https://www.elastic.co/search-labs/blog/elasticsearch-knn-and-num-candidates-strategies https://www.elastic.co/search-labs/blog/simplifying-knn-search https://www.elastic.co/guide/en/elasticsearch/reference/master/knn-search.html#tune-approximate-knn-for-speed-accuracy https://discuss.elastic.co/t/elastic-knn-search-questions/344684
是的,您不会评估分片中的所有文档。 是的,涉及到一点随机性。
搜索所有文档的成本太高。
HNSW(分层可导航小世界)算法将通过将相似的向量链接在一起来工作。但不是所有矢量。
然后在搜索时,算法随机选择一个节点,并仅计算最接近的邻居。 如果邻居距离较近,则会一遍又一遍地重复该过程,直到达到最大候选数。
所有分片返回其近似选择,并计算前 k。
所以,是的,您将具有随机性,并且具有相同参数的 2 个查询可能不会得到相同的结果。