`

影响lucene的评分的几种方法

 
阅读更多

评分功能,在全文检索中也算是一个非常重要的模块,因为评分的好坏,直接决定着用户搜索匹配的相关性,试想一下假如用户输入了一个搜索词,搜索引擎返回了一大堆不相关的信息,或者没有层次性,重点性的结果,那么看起来将是一件多么糟糕的事情。

lucene默认的评分机制,用的VSM(Vector  Space Model)空间向量模型,基于TF-IDF的评选方式,TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性 随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询 之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序。

TF-IDF模型,作为一种加权策略,在信息检索,搜索引擎,数据挖掘方面被广泛应用,这种模型在lucene中也得到了很好的实现。


我们先来看下,一般常用的方法加权,在索引时给某个
Field加权

<pre name="code" class="java"> Field field=   new Field("title", "过程", type);
   field.setBoost(10.0f);</pre>
这种方式在lucene4.x之前可以给文档和域分别进行加权,但是在4.x之后,只能给域加权,废弃了文档加权的方式,如果想给文档加权,就需要对每个域分别加权,来提升这个文档的权重。

对比索引时的加权,我们在检索时也可以设置加权boost,代码示例如下:

<pre name="code" class="java">Query q=parser.parse(term);
q.setBoost(8f);//检索时加权

</pre>
或者也可以用,queryparse的解析表达式表示:
<pre name="code" class="java">Query q=parser.parse("lucene^10 solr^5");</pre>

除了,上面的几种方式外,我们还可以自定义评分在源码级别改变一些打分策略:

1,coord(int overlap, int maxOverlap),协调因子,这个因素起什么作用呢,

举个例子现在我索引里面有2条数据:

(1)中国一个多民族国家
(2)中国是世界人口大国

当我们检索“中国”的时候,会发现这两个文档的评分一样,因为他们的长度也相等,
而当我们检索“中国   民族”的时候会发现第一个文档会排在前面而且得分要高,为什么呢?

overlap的个数,代表我们在文档中命中的个数
maxOverlap的个数,代表着检索条件里面的个数==&gt;“中国   民族”2个

由此我们假设其他的条件一样的情况下可以推算出1的得分=2/2=1
而第二个的评分是=1/2=0.5
所以文档1的评分会更好,因为它命中了更多的term。

在源码里方法如下:

<pre name="code" class="java"> public float coord(int overlap, int maxOverlap) {
    return overlap / (float)maxOverlap;
  }</pre>

2,影响评分的第二个因素queryNorm,这个因素,影响评分,但不影响排序的结果,举个例子,如果我们想要把lucene的所有的记录得分的结果,给整体变大,或变小一些,那么我们就可以调整个参数,来控制整体的得分比率。
在lucene的源码里表示如下方法:

<pre name="code" class="java"> public float queryNorm(float sumOfSquaredWeights) {
    return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));
  }</pre>

3,影响评分的第三个因素,TF,这个因素代表着一个term在某一篇文档中,如果它出现的频次越大,那么对应的评分就越高,我们假设,其他的评分因子都一样,有如下2篇文档:

(1)中国人的一天是怎么度过的呀?
(2)我们是中国人,他们也是中国人


我们检索“中国人”,会发现文档2的得分会比文档1的高,因为中国人的这个term,在文档2中出现了2次,在文档1中,只出现了一次。由此计算评分得:

假设基数都一样是10,那么文档1的得分=10*1=10
而文档二的得分则是=10*2=20,假设其他因子都一样,那么此时
文档2的总体评分就会高于文档1,在显示结果时,会优先排在命中结果集的上方。
lucene源码里的方法如下:

<pre name="code" class="java"> public float tf(float freq) {
    return (float)Math.sqrt(freq);
  }</pre>

4,影响评分的第四个因素IDF,这个参数代表的含义是,在所有的文档中,如果某个term频繁出现,那么这个term就被认为是普遍词,所以它的得分就要被减免。

举例如下3个文档:
(1)狗是一种聪明的动物。
(2)猫和狗你更喜欢那个。
(3)狗的种类也有许多种。

现在我们检索“狗  猫”,结果呢,我们会发现文档2排在结果集的首位,为什么呢?
这其实就是IDF的思想,因为狗这个term在所有的文档中出现的次数大于猫,所以在IDF进行评分时,会降低其的评分。

在lucene源码里,idf的方法如下:
注意加1的二个作用第一个是为了避免除数的为0的情况,第二个是为了这个文档在整个文档中不存在的时候,避免其的评分为0的情况存在。

<pre name="code" class="java"> public float idf(long docFreq, long numDocs) {
    return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
  }</pre>
5,影响评分的第五个因素lengthNorm,这个因素是基于文档内容的长度计算的。举例如下:

有2个文档:
(1)中国
(2)中国人

这个时候我们在检索“中国”的时候,文档1就会排在文档2的前面,为什么会这样呢,明明中国一词在他们中间都出现了一次,造成这样情况出现,恰恰是由于lucene在计算评分,会将文档的长度计算在里面,因为根据常识,较短文本里,出现命中的词,说明这个词更加重要。

lucene源码里的代码如下:

<pre name="code" class="java">public float lengthNorm(FieldInvertState state) {
    final int numTerms;
    if (discountOverlaps)//代表对同义词不出理
      numTerms = state.getLength() - state.getNumOverlap();
    else
      numTerms = state.getLength();
   return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));
  }</pre>


6,lucene里影响评分的第六个因素,载荷Payload,这个功能是一个高级的功能,可以存储时,存储额外的信息,从而在检索时,达到从某种类型的数据动态加权。

举个例子,我们可能希望某个XML里面被如果含 有&lt;keyword&gt;&lt;/keywrod&gt;标记的词从而拥有更高的加权,这时候我们就可以利用 载荷实现了,在索引的时候,我们判断term里的标签标记,如果出现了这个特定标签的标记的term,我们就额外存储它的加权载荷信息,从而再检索时,来 达到一个良好的检索结果。这时候使用载荷,是一个再好不过的选择了。

lucene的源码里对载荷的方法描述如下:

<pre name="code" class="java">  public float scorePayload(int doc, int start, int end, BytesRef payload) {
    return 1;
  }
</pre>

\上文介绍的6种因素外,加上散仙在文章开始部位介绍的boost放权,目前已经介绍了7种影响打分的因素,当然到这里,并不意味着,这些就是全部 的影响评分的方法了,事实上除了这些,还有一些其他的自定义评分的方式,这个散仙会在后续的文章里介绍,大部分的时候,我们了解,利用这些信息,就能解决 狠多业务上的需求了,所以我们可以在我们需要的任何时候,都可以继承DefaultSimilarity类,来重写和我们业务相关的最好的打分策略。

 

 

转载

分享到:
评论

相关推荐

    lucene源码和程序

    在`lucene-1.4-final`这个压缩包中,包含了Lucene 1.4版本的源代码,你可以深入研究其内部实现,理解各个类和方法的工作原理。同时,这也可以帮助你定制分析器、优化搜索性能,或者扩展Lucene的功能,例如集成到你的...

    lucene3源码分析

    Lucene的索引文件格式是其高效检索性能的基础,主要包括以下几个方面: - **基本概念**:介绍Lucene索引文件的基本术语和概念。 - **基本类型**:定义了索引文件中使用的数据类型。 - **基本规则**:阐述了文件格式...

    lucene自定义排序实现

    在 Lucene 中,实现自定义排序主要有两种方式: 1. **FieldCache排序**:这是最简单的方法,适用于基于文档字段值的排序。你需要在索引时为需要排序的字段创建一个专用的“排序字段”,并确保其存储(stored)和可...

    Lucene5学习之拼音搜索

    4. **评分与排序**:为了提供准确的搜索结果,Lucene会根据匹配度对结果进行评分,并按评分高低进行排序。拼音搜索时,可以结合汉字和拼音的匹配情况来计算评分。 5. **优化**:为了提升性能,可以采用一些优化策略...

    lucene原理与代码分析完整版

    ### Lucene原理与代码分析概览 ...- 影响Lucene文档评分的多种因素。 - Lucene中的TooManyClauses异常及其解决方法。 通过上述内容的学习,读者可以全面掌握Lucene的工作原理和技术细节,从而更好地应用于实际项目中。

    Lucene索引和查询

    - 匹配评分(Scoring):Lucene使用TF-IDF(Term Frequency-Inverse Document Frequency)或其他评分算法,计算每个文档与查询的相关性。 - 结果排序(Sorting):根据评分对匹配到的文档进行排序,返回最相关的文档...

    LUCENE的搜索引擎例子

    2. **索引存储**:索引构建完成后,Lucene会将其保存到磁盘上,形成一种倒排索引结构,便于快速查找包含特定词汇的文档。索引文件包括字段信息、词典、Posting List等。 3. **查询处理**:当用户在前端输入查询时,...

    lucene演示需要的数据

    5. **评分和排序**:Lucene根据相关性对匹配结果进行评分,并根据分数进行排序,以便用户得到最相关的搜索结果。 6. **更新和删除**:Lucene支持对已有索引的文档进行更新和删除操作,以保持数据的实时性。 综上所...

    lucene学习总结

    Lucene的索引文件主要包括以下几个部分: - **段(Segment)**:是Lucene的基本存储单元,每个段包含一组文档和对应的倒排索引。段是不可变的,新的文档会被添加到新的段中,旧的段会被合并以优化存储和检索效率。 ...

    搜索引擎的搭建(Lucene)代码

    通过阅读《搜索引擎的搭建(Lucene)》这篇文章(链接:https://blog.csdn.net/yyhui95/article/details/72526193),你将能够深入了解Lucene的具体使用方法,并学习如何将其应用到实际项目中。提供的代码文件应该...

    Lucene+3.0+原理与代码分析完整版

    4. **影响 Lucene 对文档打分的因素**:包括词条频率、文档频率、文档长度、词条位置等。 5. **TooManyClause 异常**:当查询包含过多的子查询时,Lucene 会抛出 TooManyClauses 异常,以防止内存溢出等问题。 6. ...

    lucene的排序过滤和分页.zip

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

    一个非常好的检测lucene索引库的工具

    同时,理解Lucene的基础知识,如分词、倒排索引、评分机制等,将有助于更好地利用这个工具。 总的来说,这个“lucene tool”对于任何使用Apache Lucene构建搜索引擎的人来说都是一个宝贵的资源,它可以提高系统的...

    Lucene.net开发最全文档

    - **英文原版 API**:提供原始的 Lucene 功能介绍,包括类库结构、方法、属性等,适合有一定基础的开发者深入研究。 - **中文 API**:对于中文开发者来说,中文文档能更好地理解和掌握 Lucene.net 的使用,避免...

    最全的lucene-2.4.0jar包

    Analyzer是Lucene的关键部分,因为它直接影响到搜索结果的质量。 3. **Highlighter模块**:`lucene-highlighter-2.4.0.jar` 提供了高亮显示查询匹配部分的功能,这在用户界面中展示搜索结果时非常有用,可以突出...

    Lucene检索文本,建立索引

    6. **排序与评分**: Lucene提供了一种基于TF-IDF(词频-逆文档频率)的默认评分机制,以确定哪些文档与查询更相关。我们还可以自定义评分函数,以适应特定的业务需求。 接下来,我们要将Lucene与**Struts** 结合,...

    基于Lucene的中型搜索引擎(C#)

    总的来说,基于Lucene的中型搜索引擎(C#)结合了开源的全文检索库和C#语言的优势,为企业或个人开发自定义搜索引擎提供了一种高效且灵活的解决方案。通过深入理解Lucene的原理和ShootSearch的优化策略,开发者可以...

    Lucene.Net 实现全文检索

    搜索结果通常按照相关性排序,相关性由 Lucene.Net 内部的评分算法计算得出。 5. **结果展示**:最后,将搜索结果以用户友好的方式呈现出来,可以是列表形式,包括匹配的文档标题、摘要等信息。 在整个过程中,还...

    Lucene_3.0_原理与代码分析

    TF-IDF 是一种统计方法,用来评估一个词条在一个文档中的重要程度。公式如下: \[ \text{TF-IDF}(t,d,D) = \text{TF}(t,d) \times \text{IDF}(t,D) \] 其中: - \( \text{TF}(t,d) \) 表示词条 \( t \) 在文档 \...

Global site tag (gtag.js) - Google Analytics