我在 opendistro elasticsearch 版本 7.8.0 中使用“cosinesimil”作为 knn.space_type。我索引了 3 个属性类型为 knn_vector 的文档(除了 knn_vector 之外,唯一提供的其他属性是值为 1 的状态项)。这些文档的 3 个向量是 (2,2)、(2,1) 和 (2,3)。
令人惊讶的是,当我使用查询搜索向量 (1,1) [带有状态 = 1 的后过滤器] 时:
{
"size": 1,
"query": {
"knn": {
"embedding": {
"vector": [1, 1],
"k": 1
}
}
},
"post_filter": {
"term": {"status": 1}
}
}
每次执行查询时,我都会得到不同的召回向量。有时,我得到带有向量 (2,1) 和 _score 0.5 的文档,而其他时候我得到带有 _score 1.0 的文档 (2,2)。
问题:
- 为什么在执行相同的查询时会得到不同的召回向量?
- 为什么来自 elasticsearch 的带有向量 (2,1) 的文档的 _score 会变为 0.5。只有 cosinesimil 应该会影响分数,并且 (2,1) 和 (1,1) 之间的 cosinesimil 大约是 0.95?
- 当使用具有 knn 参数 k = 3 和 size = 3 的相同 ES 查询并多次执行它时……有时我得到 _score 0.5 的 doc (2,1) 有时我得到分数 0.95(实际 cosinesimil )。