检索模型也就是文档和查询词的相关度的评分方法。Lucene使用布尔模型来确定哪些文档匹配上查询词,使用向量空间模型(VSM)来对这些文档评分。
核心
评分算法中的向量空间模型使用Tf-idf计算权重,对给定的词t和文档x,Tf(t,x)的值和词t在x中出现的次数正相关,而idf(t)的值和索引文档集合中包含词t的次数负相关。
相关名词
tf/词频 度量一个文档里词出现的频率
idf/逆向文件频率 度量一个词出现在索引中的频率
coord 文档中发现的查询词的频率
lengthNorm 根据索引列中的词总数来衡量一个词的重要度
queryNorm 归一化的参数便于比较查询
boost(index) 索引时的域的加权
boost(query) 查询时的域的加权
tf
函数: sqrt(freq)
意义: 一个词在文档里出现的频率越高,则该文档的分值越高
说明: 多次包含同一个词的文档的相关度更高
idf
函数: log(numDocs(docFreq+1) +1
意义: 一个词越多出现在不同的文档里,则它的分值越低
说明: 常见词的重要性要低于不常见的词
coord
函数: overlap/maxOverlap
意义: 对于查询中的词,文档中包含这些词越多分值越高
说明: 分值高的文档要更多地覆盖查询中的词
lengthNorm
函数: 1/sqrt(numTerms)
意义: 如果匹配上包含较少词的索引列中的词,则这个文档有较高的权重
说明: 如果一个词在含有少量词的列中,则它比在包含较多词的列中的词更重要
queryNorm
函数: 1/sqrt(sumOfSquaredWeights)
意义: 和文档的相关性无关,只是为了让不同的查询之间的分值有可比性
总结
打分算法为了达到如下效果:
包含所有搜索词的文档是好的
匹配很少出现的词比常用词更好
长文档不如短文档好
多次提及搜索词的文档更好
从正常逻辑看,基本符合预期,但是对长文档的打低分有点奇怪。于是,Lucene允许你定义min/max,指定你认为的文档长度应该是什么范围,在这个区间,lengthNorm都是1.0,低于最小值或高于最大值,lengthNorm会以几何形式下降。
---------------------