lucene solr 使用 余弦 相似 性 吗 ?

piwo6bdm  于 2022-11-07  发布在  Lucene
关注(0)|答案(3)|浏览(239)

我写了一个小型的搜索引擎作为我的每周项目,它是基于查询向量和文档向量之间的余弦相似度,向量是用tf-idf符号的分数来计算的。
我已经了解了Apache Solr,这是一个全文搜索引擎。我的问题是,在对搜索结果进行排名时,Solr内部是否使用余弦相似性?

qojgxg4l

qojgxg4l1#

不。Solr使用了与余弦相似性 * 相似 * 的东西,但并不完全相同--有一些关键的区别。
如果您访问相同的链接(https://lucene.apache.org/core/4_10_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html)并进一步向下滚动,您将看到“Lucene概念性评分公式”和“Lucene实践性评分公式”,它们给予了更多细节。
忽略任何索引/查询时提升,下面是一些关键区别:

1.不同的文档规范化因子

它使用“doc-len-norm”,而不是通过其tf-idf向量的欧几里得范数对每个文档进行归一化。(默认相似性)这只是1/sqrt(文档中的项数),基本上等于1/sqrt(sum(tf))-即,其中tf是文档中的项数之和-没有像欧几里得范数那样平方,并且省略了每一项的idf。此外,该值被舍入为一个字节以保存空间。这通常会得到与用于余弦相似性的归一化因子不同的值。

2.额外的“协调”提升

还有一个额外的值乘以分数,等于:文档中匹配的查询词的数量/查询中的词的总数。
这给了匹配更多查询词的字段(文档)额外的提升,并且可能是有问题的值。这本质上是将tf-idf向量得分乘以另一个内积-这些向量转换成布尔向量的内积(如果没有给定的词,则为0,如果有,则为1)与仅由其欧几里得范数归一化的查询向量。

kognpnkq

kognpnkq2#

是的,Solr(在Lucene上运行)确实使用余弦相似性。
对于查询q的文档d的VSM得分是加权查询向量V(q)和V(d)的余弦相似度
余弦相似度(q,d)= V(q)· V(d)/|V(q)||V(d)|
https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html

rjee0c15

rjee0c153#

如果您要在Solr中查找实际的向量相似性,有两种方法:1)使用带分隔符的有效负载。有一些插件已经实现了这一点,比如https://github.com/moshebla/solr-vector-scoringhttps://github.com/saaay71/solr-vector-scoring
2)使用流表达式,它是现成的:https://lucene.apache.org/solr/guide/8_5/vector-math.html
后者速度较慢,但更灵活。

相关问题