`

Lucene Similarity (Lucene 文档评分score机制详解)

 
阅读更多

个人博客:http://demi-panda.com

 

 

文档的分值代表了该文档在特定查询词下对应的相关性高低,他关联着信息检索向量空间模型中的向量夹角的接近度。一个文档越与查询词相关,得分越高。分值计算公式如下:

score(q,d)   =   coord(q,d) · queryNorm(q) ·   ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) )
                                                                      t in q  

其中

tf(t in d)

这个值衡量着Term在文档中出现的频率,也就是词频。关键词在文档中出现的次数越多,得分越高,这个值在DefaultSimilarity的计算公式如下(词频的平方根):

tf(t in d)   =    frequency½

idf(t)

代表着该词的逆词频,这个值衡量了该词在整个文档库中出现的频度。这意味着,一个词出现的越少,根据香农的信息公示,他越珍稀。同时将贡献更多的分值给总 分值。默认的计算公式如下(其中numDocs代表整个文档的数量,docFreq代表了含有Term t的文档数量):

                                   numDocs
idf(t) =    1 + log    ( –––––––––   )  
                                  docFreq+1

coord(q,d)

这个分值衡量了文档中含有多少Term。文档中出现的越多,越全,将获得越高的分值。举个例来说,查询“lucene”和"Apache",同时出现两个Term的肯定比只出现一个lucene或者Apache的分值高。这个值是搜索时动态计算的,默认的计算公式如下:

coord(q,d) = overlap / maxOverlap

queryNorm(q)

这个标准化因子用于在多个查询器中进行比较。它并不影响文档的排名。它的主要作用在于多个查询器返回的结果进行比较,甚至是结果来自多个索引时。这是搜索时的权重因子,当给查询器设置权重时就是通过这个因子进行影响的。默认的实现公式如下:

                                                                                                           1
queryNorm(q)   =   queryNorm(sumOfSquaredWeights)   =   ––––––––––––––
                                                                                         sumOfSquaredWeights½

其中的sumOfSquaredWeights的计算公式如下:(可以清晰的看到获取query的boost,当没给查询器设置值时,默认为1,不起作用)

sumOfSquaredWeights   =   q.getBoost() 2 ·   ∑ ( idf(t) · t.getBoost() ) 2  
                                                                      t in q

t.getBoost()

该值是一个搜索时权重因子,可以在查询时给不同的Term设置不同的权重,可以通过lucene语法(具体参见我翻译的另外一篇文章:hi.baidu.com/expertsearch/blog/item/8d4f7d355a2e413c5ab5f547.html ),也可以通过setBost()函数,注意,在多Term查询器中,是没有获取单一Term权重的函数的,所以如果需要获取,只能调用相应的子查询器函数的getBoost()函数。

norm(t,d)

封装了一些索引时因子以及长度因子。
Document boost - 在索引时,添加到Index前可以通过doc.setBoost()设置,衡量了Document的重要程度。.
Field boost - 在将字段加入到文档前可以通过调用field.setBoost()来设置字段的权重。
lengthNorm(field) - 该值在将文档添加到索引时,根据所有文档中特定字段的Term数来计算。所以默认更短的字段将贡献更多的分值。

                                                   1
lengthNorm(field) =   ––––––––––––––
                                           numTerms½

当文档加入索引时,以上因子将相乘,如果一个文档中有多个同名的字段,那么将多个多同的权重也相乘。

norm(t,d)   =   doc.getBoost() · lengthNorm(field) ·   ∏ f.getBoost()
                                                                       field f in d named as t

可是还有件值得注意的事情,这个值在索引时计算完毕后将编码为一个Byte存储起来,在搜索时,再从文件中读取出该 值并解码成float。在这个过程中,可能会造成精度的缺失,并不能保证decode(encode(x)) = x,比如,有可能decode(encode(0.89)) = 0.75,同样值得注意的是,在搜索时改变此值已经太晚了。例如,用一个不同于DefaultSimilarity的实现。


相关函数:
setDefault(Similarity), IndexWriter.setSimilarity(Similarity), Searcher.setSimilarity(Similarity)

 

原文出处:http://hi.baidu.com/expertsearch/blog/item/2a95d7035677e4084afb5121.html

分享到:
评论

相关推荐

    lucene评分公式详解

    为了自定义评分公式,Lucene提供了一些接口,如`similarity`和`similarity.Similarity`。你可以创建自己的相似度类,覆盖这些方法来改变TF、DF或IDF的计算方式,或者添加新的评分因子。例如,你可以实现一个更注重...

    Lucene.net中文帮助文档

    **Lucene.NET中文帮助文档详解** Lucene.NET是一款开源全文搜索引擎库,它是Apache Lucene项目在.NET框架下的实现。这个库提供了高级的信息检索服务,包括文本分析、索引和搜索功能,广泛应用于各种需要高效搜索...

    lucene-4.6.0官方文档

    搜索则是通过查询解析和评分机制来定位匹配的文档,而结果排序则依据相关性来确定返回给用户的顺序。 2. **API详解** 在Lucene 4.6.0中,主要API包括Analyzer、IndexWriter、Directory、QueryParser、Searcher等。...

    Lucene示例 BM25相似度计算

    默认情况下,Lucene使用TF-IDF相似度计算查询与文档的相关性。TF-IDF是“词频-逆文档频率”的缩写,它重视在少有文档中出现的词项,认为这样的词项更能区分文档。然而,TF-IDF并未考虑文档长度,可能会导致短文档被...

    Lucene-2.0学习文档

    本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...

    lucene-4.6.1官方文档

    《Apache Lucene 4.6.1 官方文档详解》 Apache Lucene 是一个开源全文搜索引擎库,它为开发者提供了强大的文本搜索功能。在4.6.1这个版本中,Lucene 继续保持着其在信息检索领域的领先地位,提供了一系列优化和改进...

    lucene-core-7.2.1-API文档-中文版.zip

    包含翻译后的API文档:lucene-core-7.2.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.lucene:lucene-core:7.2.1; 标签:apache、lucene、core、中文文档、jar包、java; 使用方法:解压翻译后的API...

    Lucene技术文档doc

    3. **文档检索**:根据查询结果,Lucene能够快速返回与查询相关的文档列表,同时提供相关度评分。 4. **排序与高亮**:Lucene不仅可以返回匹配的文档,还能根据相关度进行排序,并对匹配的查询词汇进行高亮显示。 *...

    lucene 搜索中文PDF文档

    2) 实施近实时搜索,利用Lucene的段合并机制;3) 对索引进行定期优化,以减少碎片;4) 根据需求选择合适的评分算法,如TF-IDF或BM25。 最后,应对中文搜索的挑战,比如歧义、同音词和多音字,可能需要引入更复杂的...

    Lucene.net学习帮助文档

    **Lucene.net学习帮助文档** Lucene.net是一个开源全文搜索引擎库,它是Apache Lucene项目的一部分,专门针对.NET Framework进行了优化。这个压缩包包含了Lucene.net的源码和中文学习文档,旨在帮助开发者深入理解...

    lucene文档笔记详解

    **Lucene文档笔记详解** Lucene,源自Apache软件基金会4 Jakarta项目组,是一个备受开发者青睐的开源全文检索引擎工具包。它提供了强大的文本分析、索引构建和搜索功能,但值得注意的是,Lucene本身并不包含完整的...

    lucene 自定义评分

    `Similarity` 类是 Lucene 中用于计算评分的核心接口,包含了诸如 `lengthNorm`(字段长度规范化)、`tf`(词频)、`idf`(逆文档频率)等关键方法。 例如,假设我们需要为最近发布的文档赋予更高的评分,可以这样...

    lucene-4.7.0官方文档

    7. **API详解**:文档涵盖了Lucene的主要类和接口,如IndexWriter用于创建和更新索引,Directory作为索引的存储容器,IndexReader用于读取索引,以及Searcher用于执行搜索等。 8. **示例代码**:文档中包含了丰富的...

    lucene 3.0 API 中文帮助文档

    **Lucene 3.0 API 中文帮助文档详解** Lucene 是一个开源的全文检索库,由Apache软件基金会开发并维护。它提供了高级的文本搜索功能,被广泛应用于各种信息检索系统。本篇将深入探讨Lucene 3.0 API的中文帮助文档,...

    Lucene开发详解.pdf

    ### Lucene开发详解 #### 一、Lucene简介 Lucene是一个高性能、全功能的文本搜索引擎库,由Doug Cutting创建并捐赠给Apache Software Foundation。它主要用于构建全文搜索应用程序,能够帮助开发者快速地在其应用...

    毕设 Lucene解析索引PDF文档的内容

    iTextPDFExtractor.java ------ ...--PDFBox创建PDF文件的Lucene索引 PDFBoxPathIndex.java ------- --PDFBox创建指定目录PDF文档索引 POIOfficeExtractor.java ----- -- POI处理Excel和Word文档代码

    lucene2.3API中文文档、lucene-3.5.0JAR包

    首先,`lucene2.3API中文文档.chm`是针对Lucene 2.3版本的中文API文档,这为中文开发者提供了便利,帮助他们理解并使用这个版本的Lucene。在文档中,你可以找到关于Lucene核心组件的详细信息,如Analyzer(分析器)...

    lucene-core-7.7.0-API文档-中文版.zip

    包含翻译后的API文档:lucene-core-7.7.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.lucene:lucene-core:7.7.0; 标签:apache、lucene、core、中文文档、jar包、java; 使用方法:解压翻译后的API...

    Lucene 常用功能介绍视频详解

    默认的排序依据是文档的相关性分数(由`Similarity`和`TF-IDF`算法计算得出)。用户还可以自定义评分函数以适应特定的业务场景。 6. **近实时搜索** 通过NRT(Near Real Time)机制,Lucene能够迅速反映索引的最新...

    Lucene3.3_API文档

    - **评分函数(Scoring)**: Lucene使用TF-IDF等算法来计算文档的相关性分数。 - **高亮(Highlighting)**: Lucene提供Highlighter类,用于在搜索结果中突出显示匹配的部分。 ### 4. 应用场景 Lucene广泛应用于...

Global site tag (gtag.js) - Google Analytics