`
zhanshenny
  • 浏览: 265017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene 文档评分score机制

阅读更多
翻译:Lucene Similarity (Lucene 文档评分score机制详解)2008-11-28 19:09
文档的分值代表了该文档在特定查询词下对应的相关性高低,他关联着信息检索向量空间模型中的向量夹角的接近度。一个文档越与查询词相关,得分越高。分值计算公式如下:

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)


分享到:
评论

相关推荐

    lucene 5.4.1 官方文档离线版

    - **Scoring**: Lucene的评分机制,基于TF-IDF等算法评估文档的相关性。 3. **高级特性**: - **MultiFieldQueryParser**:允许在一个Document的多个Field中进行搜索。 - **Filter**和**QueryWrapperFilter**...

    lucene API文档

    Lucene允许根据文档的评分(score)或者自定义字段进行排序。评分是基于查询与文档的相关性计算得出的,可以通过Similarity类进行调整。此外,还可以使用FieldDoc排序,依据文档中的某个字段值进行排序。 五、其他...

    lucene-搜索过程源码解析-Score树

    标题与描述均聚焦于“Lucene搜索过程源码解析—Score树”,这表明文章将深入探讨Lucene这一流行的信息检索库在实现搜索功能时的核心机制之一:Score树。Lucene是一个开源的全文检索引擎工具包,它提供了创建索引、...

    Lucene3.3_API文档

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

    lucene 权重设置

    7. **搜索相关度评分(Score)**:Lucene为每个匹配查询的文档计算一个分数,表示其与查询的相似度。分数的计算涉及多个因素,包括词频(tf)、逆文档频率(idf)、激励因子(boost)和长度规范(lengthNorm)。高...

    lucene示例 demo+jar包

    6. **搜索器(Searcher)**: 搜索器执行查询,根据索引返回匹配的文档,并根据评分(relevancy score)排序。 **Lucene 示例与 Demo** "lucene示例"通常包含了演示如何使用 Lucene 的代码片段或完整的应用。这些...

    lucene.jar

    7. 文档评分(Score):Lucene根据查询的相关性对结果进行评分。 二、功能特性 1. 全文检索:支持对文本的精确匹配、模糊匹配、短语查询等多种检索方式。 2. 高效性能:通过倒排索引实现快速的查询响应。 3. 空间...

    lucene2.9.1完整DEMO及开发文档

    它包含符合条件的Document的内部编号(doc)及评分(score)。 5) 示例代码: //keyword要搜索的关键字。indexDir索引存放的目录 public static void searcher(String keyword, File indexDir){ IndexSearcher ...

    lucene3.0.3搜索的使用示例

    9. **Score**:Lucene根据文档与查询的相关性给出一个分数,得分最高的文档被认为是最相关的。 10. **Hit** 和 **Hits**:Hit表示单个搜索结果,而Hits是所有匹配结果的集合。 11. **Filter**:可以用于进一步筛选...

    Lucene---全文检索(文档pdf/txt/office/html)

    4. **匹配与排序**: Lucene 使用这些查询词在索引中查找匹配的文档,根据评分(Relevance Score)对结果进行排序。 5. **返回结果**: 最后,系统返回得分最高的若干文档作为搜索结果。 ### 3. Lucene 支持的文档...

    lucene全文检索案例源码

    - 使用自定义ScoreFunction:根据业务需求,自定义评分函数,使搜索结果更符合用户期望。 - 利用Filter和QueryWrapperFilter:过滤无关文档,提升搜索效率。 五、总结 通过对“lucene全文检索案例源码”的学习,...

    lucene的排序过滤和分页.zip

    Lucene支持两种类型的排序:基于评分(Score Sorting)和基于字段(Field Sorting)。基于评分的排序默认按照相关性排序,即每个文档与查询匹配的程度。而基于字段的排序则可以根据文档的特定字段值进行排序,如日期...

    lucene源码

    - **结果排序**:根据文档的评分(Score)对搜索结果进行排序,评分计算涉及到 `Similarity` 类的实现。 - **结果获取**:最后,使用 `Document` 对象从索引中读取搜索结果中的详细信息。 **3. Lucene 源码学习...

    lucene-6.6.3.zip

    - **TopDocs**: 返回匹配的文档集合,通常包括最高评分的一定数量的文档。 **5. 扩展与优化** Lucene 提供了多种扩展点,比如自定义 Analyzer、Filter 和 Collector,以适应不同场景的需求。例如,可以通过自定义 ...

    lucene-3.02

    2. **缓存策略**:利用Lucene的缓存机制,如TermVectorCache和DocumentCache,提升查询速度。 3. **倒排索引优化**:通过调整段合并策略和位图索引,进一步提升搜索效率。 4. **实时索引**:结合NRT(Near Real ...

    Lucene Demo组件

    Lucene 支持基于评分(Score)、文档ID或自定义字段的排序。使用 `Sort` 类定义排序规则,并在执行查询时传递给 `IndexSearcher`。 5. **性能优化** - **批量索引**:一次处理大量文档比逐个添加更高效。 - **...

    基于lucene的开发JavaEE项目

    同时,我们还可以使用评分函数(ScoreFunction)和自定义比较器(Comparator)实现复杂的排序逻辑。 5. **高亮显示**:在搜索结果中,通常需要突出显示匹配的关键词。Lucene的Highlighter组件可以自动完成这个任务...

    全文检索Lucene 全文检索Lucene

    - **Score**:Lucene会根据相关性对结果进行评分,高分代表更相关。 - ** Hits**:查询结果集,包括匹配的文档及其分数。 - **Hit**:单个匹配的文档,包括文档ID、分数和其他相关信息。 4. **Compass检索框架**...

    luceneDemo(完整代码)

    除此之外,还可以通过自定义ScoreFunction或使用BM25等更复杂的评分模型来调整排序规则。 在"luceneDemo4.0"中,你将会看到以上概念的具体应用,包括创建索引、执行查询、高亮展示结果以及调整排序逻辑的示例代码。...

    lucene高级搜索进阶项目_03

    接下来,我们将关注Lucene的排序和评分机制。默认情况下,Lucene根据相关性对搜索结果进行排序,这涉及到TF-IDF算法。我们可能需要定制ScoreFunction或者使用CustomScoreQuery来自定义评分规则,以满足特定业务需求...

Global site tag (gtag.js) - Google Analytics