`
wbj0110
  • 浏览: 1604633 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Lucene 源代码剖析-12 如何给文档评分 源代码剖析-11 如何给文档评分

 
阅读更多

Lucene 源码剖析

7           如何给文档评分

    

Similarity类负责给文档评分。

    

7.1   文档评分类Similarity

7.1.1       org.apache.lucene.search. Similarity

Similarity类实现算分(scoring)的API,它的子类实现了检索算分的算法。DefaultSimilarity类是缺省的算分的实现,SimilarityDelegator类是用于委托算分(delegating scoring)的实现,在Query.getSimilarity(Searcher)}的实现里起作用,以便覆写(override)一个SearcherSimilarity实现类的仅有的确定方法(certain methods)。

  

   

查询q相对于文档d的分数与在文档和查询向量(query vectors)之间的余弦距离(cosing-distance)或者点乘积(dot-product)有关系(correlates to),文档和查询向量存于一个信息检索(Information Retrieval)的向量空间模型(Vector Space Model (VSM))之中。一篇文档的向量与查询向量越接近(closer to),它的得分也越高(scored higher),这个分数按如下公式计算:

  

 

 

   

其中:

1.          tf(t in d) term的出现次数(frequency)有关系(correlate to),定义为(defined asterm t在当前算分(currently scored)的文档d中出现(appear in)的次数(number of times)。对一个给定(gived)的term,那些出现此term的次数越多(more occurences)的文档将获得越高的分数(higher score)。缺省的tf(t in d)算法实现在DefaultSimilarity类中,公式如下:

  

 

    

2.          idf(t) 代表(stand for)反转文档频率(Inverse Document Frequency)。这个分数与反转(inverse of)的docFreq(出现过term t的文档数目)有关系。这个分数的意义是越不常出现(rarer)的term将为最后的总分贡献(contribution)更多的分数。缺省idff(t in d)算法实现在DefaultSimilarity类中,公式如下:

  

 

    

3.          coord(q,d) 是一个评分因子,基于(based on)有多少个查询terms在特定的文档(specified document)中被找到。通常(typically),一篇包含了越多的查询terms的文档将比另一篇包含更少查询terms的文档获得更高的分数。这是一个搜索时的因子(search time factor)是在搜索的时候起作用(in effect at search time),它在Similarity对象的coord(q,d)函数中计算。

  

4.          queryNorm(q) 是一个修正因子(normalizing factor),用来使不同查询间的分数更可比较(comparable)。这个因子不影响文档的排名(ranking)(因为搜索排好序的文档(ranked document)会增加(multiplied)相同的因数(same factor)),更确切地说只是(but rather just)为了尝试(attempt to)使得不同查询条件(甚至不同索引(different indexes))之间更可比较性。这是一个搜索时的因子是在搜索的时候起作用,由Similarity对象计算。缺省queryNorm(q)算法实现在DefaultSimilarity类中,公式如下:

  

 

    

sumOfSquaredWeights(查询的terms)是由查询Weight对象计算的,例如一个布尔(boolean)条件查询的计算公式为:

  

    

5.          t.getBoost() 是一个搜索时(search time)的代表查询q中的term tboost数值,具体指定在(as specified in)查询的文本中(参见查询语法),或者由应用程序调用setBoost()来指定。需要注意的是实际上(really)没有一个直接(direct)的API来访问(accessing)一个多个term的查询(multi term query)中的一个term boost值,更确切地说(but rather),多个termsmulti terms)在一个查询里的表示形式(represent as)是多个TermQuery对象,所以查询里的一个termboost值的访问是通过调用子查询(sub-query)的getBoost()方法实现的。

  

6.          norm(t,d) 是提炼取得(encapsulate)一小部分boost值(在索引时间)和长度因子(length factor):

ú            document boost – 在添加文档到索引之前通过调用doc.setBoost()来设置。

ú            Field boost – 在添加Field到文档之前通过调用field.setBoost()来设置。

ú            lengthNorm(field) – 在文档添加到索引的时候,根据(in accordance with)文档中该fieldtokens数目计算得出,所以更短(shorter)的field会贡献更多的分数。lengthNorm是在索引的时候起作用,由Similarity类计算得出。

当一篇文档被添加到索引的时候,所有上面计算出的因子将相乘起来(multiplied)。如果文档拥有多个相同名字的fieldsmultiple fields with same name),所有这些fieldsboost值也会被一起相乘起来(multiplied together):

  

 

   

然而norm数值的结果在被存储(stored)之前被编码成(encoded as)一个单独的字节(single byte)。在检索的时候,这个norm字节值从索引目录(index directory)中读取出来,并解码回(decoded back)一个norm浮点数值(float value)。这个编/解码(encoding/decoding)行为,会缩减(reduce)索引的大小(index size),这得自于(come with)精度损耗的代价(price of precision loss它不保证decode(encode(x))=x,举例来说decode(encode(0.89))=0.75。还有需要注意的是,检索的时候再修改评分(scoring)的这个norm部分已近太迟了,例如,为检索使用不同的Similarity

http://www.cnblogs.com/eaglet/archive/2009/02/16/1391546.html

分享到:
评论

相关推荐

    Lucene源代码剖析

    《Lucene源代码剖析》是一本深度探讨Java版本Lucene搜索引擎库的专业书籍。Lucene是Apache软件基金会的一个开源项目,广泛应用于全文检索和信息检索领域。本书旨在通过深入解析其源代码,帮助开发者理解Lucene的工作...

    Lucene 源代码剖析.rar

    这是一篇公司的内部培训教材,其中中的内容涵盖LUCENE的方方面面,从源代码角度深入剖析LUCENE,如果要对LUCENE有更加深入的了解(专家级别),这篇技术文档必不可少。 前提:对LUCENE有一定程度的了解,否则会让你云...

    lucene-5.3.1源代码

    本文将深入探讨Lucene 5.3.1版本的核心概念、架构以及如何利用其源代码进行二次开发。 一、Lucene基础 1. Lucene核心组件: - 文档(Document):存储用户数据的容器,可以包含多个字段(Field),如标题、内容等...

    lucene.net源代码

    《深入剖析Lucene.NET:基于源代码的实例解析》 Lucene.NET,作为Apache Lucene的.NET版本,是一个高性能、全文检索库,为.NET开发者提供了强大的文本搜索功能。本实例将带您深入理解Lucene.NET的内部机制,通过源...

    lucene-4.8.0源代码,比较全

    本文将深入探讨Lucene 4.8.0版本的源代码,揭示其内部工作原理以及关键组件,帮助读者理解这个强大的搜索引擎是如何工作的。 一、Lucene概述 Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)...

    lucene2.0.0搜索引擎源代码

    《深入剖析Lucene 2.0.0搜索引擎源代码》 Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。它提供了一个高效、可扩展的信息检索库,允许开发者轻松地在他们的应用程序中添加全文搜索功能。本文将重点...

    Lucene2.0+Heritrix(源代码)

    《构建搜索引擎:剖析Lucene2.0与Heritrix源代码》 在信息化时代,搜索引擎已经成为我们日常获取信息的重要工具。本章节将深入探讨如何利用Lucene2.0和Heritrix这两个开源项目构建一个基本的搜索引擎。首先,我们要...

    lucene4.9最全源代码

    这次我们关注的是Lucene 4.9.0版本,这个版本包含了所有源代码和相关的文档,为开发者提供了学习和研究的绝佳资源。 一、Lucene的基本概念 1. 文档(Document):在Lucene中,文档是信息的基本单位,可以包含多个...

    lucene-2.2.0-src

    通过分析源代码,我们可以了解到Lucene如何将文本数据转化为可以高效查询的索引结构,以及如何执行复杂的查询语句。 二、倒排索引原理 1. 分词:Lucene首先通过Analyzer进行分词,将输入的文档拆分成一系列的词汇...

    lucene3.5源码

    《深入剖析Lucene 3.5源码:揭示搜索引擎核心技术》 Lucene 3.5是Apache Lucene项目的一个重要版本,它是一个高性能、全文本搜索库,为开发者提供了强大的文本搜索功能。作为开源软件,Lucene的源码对学习和理解...

    lucene3.6源码

    《深入剖析Lucene 3.6源码》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护,被广泛应用于各种搜索引擎的构建。Lucene 3.6.1是其历史版本之一,虽然现在有更新的版本,但3.6.1版本因其稳定性及...

    lucene-2.9.0-src.tar.gz

    这个“lucene-2.9.0-src.tar.gz”文件包含了Lucene 2.9.0版本的完整源代码,为开发者提供了一个深入理解全文检索技术的宝贵资源。本文将围绕Lucene 2.9.0的核心功能、设计原理以及源码分析展开讨论。 一、Lucene...

    lucene-core-2.4.0的源码

    《深入剖析Lucene 2.4.0源码》 Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种搜索应用中。这里我们聚焦于Lucene 2.4.0版本的源码,这是一份珍贵的学习资料,对于理解Lucene的工作原理...

    Lucene2.0+Heritrix(ch4源代码)

    本篇将结合Lucene 2.0与Heritrix的源代码,探讨这两者的协同工作原理及其在实际应用中的知识要点。 一、Lucene 2.0核心概念与技术 1.1 分词器(Tokenizer)与过滤器(Filter) Lucene首先通过分词器将输入文本切割...

    Lucene2.0+Heritrix(ch3源代码)

    通过源代码,我们可以看到查询优化和评分机制的细节。 二、Heritrix 1. **网络爬虫原理**:Heritrix是一个可配置的、线程安全的网络爬虫,它可以按照预定义的策略抓取互联网上的网页。源代码中,我们可以看到URL...

    Lucene 2.0+Heriterx书源代码-ch7lib

    《深入理解Lucene 2.0与Heritrix:源码剖析》是一本关于搜索引擎开发的经典著作,书中详细讲解了如何使用Lucene 2.0和Heritrix这两个开源工具进行信息检索。在这个名为"Lucene 2.0+Heriterx书源代码-ch7lib"的压缩包...

    lucene代码

    Lucene的源代码主要分为以下几个部分: 1. 分析器(Analyzer):负责文本的预处理,包括分词和过滤。例如,`StandardAnalyzer`是常用的分析器,用于处理英文文本。 2. 搜索器(Searcher):执行查询、评分和排序。...

    lucene.net完整源码

    《深入剖析Lucene.NET:基于C#的全文检索框架》 Lucene.NET是一个开源的、高性能的全文检索库,它是Apache Lucene项目在.NET平台上的实现。这个库为.NET开发者提供了一个强大的工具,用于在各种应用程序中实现全文...

Global site tag (gtag.js) - Google Analytics