Elasticsearch: 权威指南 » 深入搜索 » 控制相关度 » 相关度评分背后的理论 学习
##词频/逆向文档频率(TF/IDF)
##当匹配到一组文档后,需要根据相关度排序这些文档,不是所有的文档都包含所有词,有些词比其他的词更重要。一个文档的相关度评分部分取决于每个查询词在文档中的 权重 。
##词频
##词在文档中出现的频度是多少?频度越高,权重 越高 。 5 次提到同一词的字段比只提到 1 次的更相关。词频的计算方式如下:
##tf(t in d) = √frequency
##词 t 在文档 d 的词频( tf )是该词在文档中出现次数的平方根。
##如果不在意词在某个字段中出现的频次,而只在意是否出现过,则可以在字段映射中禁用词频统计:
##逆向文档频率
##词在集合所有文档里出现的频率是多少?频次越高,权重 越低 。常用词如 and 或 the 对相关度贡献很少,因为它们在多数文档中都会出现,一些不常见词如 elastic 或 hippopotamus ##可以帮助我们快速缩小范围找到感兴趣的文档。逆向文档频率的计算公式如下:
##idf(t) = 1 + log ( numDocs / (docFreq + 1))
##词 t 的逆向文档频率( idf )是:索引中文档数量除以所有包含该词的文档数,然后求其对数。
##字段长度归一值
##字段的长度是多少?字段越短,字段的权重 越高 。如果词出现在类似标题 title 这样的字段,要比它出现在内容 body 这样的字段中的相关度更高。字段长度的归一值公式如下:
##norm(d) = 1 / √numTerms
##字段长度归一值( norm )是字段中词数平方根的倒数。
##字段长度的归一值对全文搜索非常重要,许多其他字段不需要有归一值。无论文档是否包括这个字段,索引中每个文档的每个 string 字段都大约占用 1 个 byte 的空间。对于 not_analyzed 字符串字段的归一值默认是禁用的,而对于 analyzed ##字段也可以通过修改字段映射禁用归一值:
##结合使用
##以下三个因素——词频(term frequency)、逆向文档频率(inverse document frequency)和字段长度归一值(field-length norm)——是在索引时计算并存储的。最后将它们结合在一起计算单个词在特定文档中的 权重 。
##weight(text:fox in 0) [PerFieldSimilarity]: 0.15342641
##result of:
fieldWeight in 0 0.15342641
product of:
tf(freq=1.0), with freq of 1: 1.0
idf(docFreq=1, maxDocs=1): 0.30685282
fieldNorm(doc=0): 0.5
##词 fox 在文档的内部 Lucene doc ID 为 0 ,字段是 text 里的最终评分。
##词 fox 在该文档 text 字段中只出现了一次。
##fox 在所有文档 text 字段索引的逆向文档频率。
##该字段的字段长度归一值。