lucene 评分机制研究

评分公式

1.coord(q,d),查询覆盖率

/** Implemented as <code>overlap / maxOverlap</code>. */
  @Override
  public float coord(int overlap, int maxOverlap) {
    return overlap / (float)maxOverlap;
  }

例如:

  查询:query=title:search and content:lucenen 确定最大覆盖maxOverlap = 2

  索引文档内容:1.{title:search ***,content:lucenen ***}

          title和content全部命中:overlap = 2  coord(q,d) = 2/2

         2.{title:search ***,content:solr ***}

          只有title命中:overlap = 1  coord(q,d) = 1/2

通过该参数影响排序的手段是修改分词使Token更多的命中Term,提高coord值

2.queryNorm(q),查询权重得分,对结果排序无影响,同一次查询该因子得分一致

  /** Implemented as <code>1/sqrt(sumOfSquaredWeights)</code>. */
  @Override
  public float queryNorm(float sumOfSquaredWeights) {
    return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));
  }

  sumOfSquaredWeights 查询权重得分

  TermQuery权重,BooleanQuery权重

t in q: term in query

  一次查询的BooleanQuery、TermQuery权重是一致的,该queryNorm因子在同一次查询对排序结果无影响,而是用来比较不同次查询的分数

∑( tf(t in d)·idf(t)^2·t.getBoost()·lengthNorm(t,d) )

括号里针对解析出的每个Term进行分数累加,例如:查询"lucene and solr",lucene的分数 + solr的分数

3.tf(TermFreq),词频,该Term在该文档出现的频率

tf = sqrt(Term在该文档出现的次数)

/** Implemented as <code>sqrt(freq)</code>. */
  @Override
  public float tf(float freq) {
    return (float)Math.sqrt(freq);
  }

查询词在该文档中出现的次数越多,表明该文档越重要

4.idf(InverseDocumentFreq逆向文本频率),docFreq(term出现的文档数量),numDocs所有文档数量

/** Implemented as <code>log(numDocs/(docFreq+1)) + 1</code>. */
  @Override
  public float idf(long docFreq, long numDocs) {
    return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
  }

5.t.getBoost(),term in document的查询权重,solr调用接口 title:lucene^3

6.lengthNorm()term in document

/** Implemented as
   *  <code>state.getBoost()*lengthNorm(numTerms)</code>, where
   *  <code>numTerms</code> is {@link FieldInvertState#getLength()} if {@link
   *  #setDiscountOverlaps} is false, else it‘s {@link
   *  FieldInvertState#getLength()} - {@link
   *  FieldInvertState#getNumOverlap()}.
   *
   *  @lucene.experimental */
  @Override
  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)));
  }

该因子由两部分组成

1.state.getBoost(),改值是由创建索引时指定的field权重

2.(float)(1.0/Math.sqrt(numTerms)),numTerms代表term对应field的长度,如果title:lucene的numTerms对应的文档"title:lucenen"比文档"title:lucene and solr"重要

时间: 2024-08-30 04:22:02

lucene 评分机制研究的相关文章

Lucene Scoring 评分机制

原文出处:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分.它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene.但个人觉得:如果要根据自己的应用调节评分(或结构排序),十分有必须深入了解 lucene 的评分机制. Lucene scoring 组合使用了 信息检索的向量空间模型 和 布尔模型 . 首先来

Lucene 的 Scoring 评分机制

转自: http://www.oschina.net/question/5189_7707  Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分.它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene.但个人觉得:如果要根据自己的应用调节评分(或结构排序),十分有必须深入了解 lucene 的评分机制. Lucene scoring 组合使用了 信 息检索的向量空间模型 和 布尔模型 . 首先来看下 lucene 的评分公式(在 Sim

Solr In Action 笔记(2) 之 评分机制(相似性计算)

Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 <这就是搜索引擎>里面对相似性计算进行了简单的介绍. 内容的相似性计算由搜索引擎的检索模型建模,它是搜索引擎的理论基础,为量化相关性提供了一种数学模型,否则没法计算.当然检索模型理论研究存在理想化的隐含假设,即假设用户需求已经通过查询非常清晰明确地表达出来了,所以检索模型的任务不牵扯到对用户需求建模,但实际上这个和实际相差较远,即使相同的查询词,不同用户的需求目的可能差异很大,而检索模型对此无能为力.几种常见的检索模

Elasticseach的评分机制

lucene 的评分机制 elasticsearch是基于lucene的,所以他的评分机制也是基于lucene的.评分就是我们搜索的短语和索引中每篇文档的相关度打分. 如果没有干预评分算法的时候,每次查询,lucene会基于一个评分算法来计算所有文档和搜索语句的相关评分. 使用lucene的评分机制基本能够把最符合用户需要的搜索放在最前面. 当然有的时候,我们可能想要自定义评分算法,这个就和lucene的评分算法没有什么关系了.当然,我们大多数应该还是会根据自己的需求,来调整lucene本身的算

【研究课题】高校特殊学生的发现及培养机制研究

依据关于征集2014年省教育科学研究重大课题选题的通知,要求推荐选题限制在300字介绍,内容例如以下: 选题:高校特殊学生的发现及培养机制研究 简要说明: 特殊学生主要有:A类(有目标,主动学习):B类(无目标,以逃课打游戏等方式度日):C类(认真但学习成绩中等及偏下). 宽松或严格的课堂考勤对学生有不同影响,A类需宽松,B类需严格,C类需单独引导. 研究目标:利用在线综合考勤平台,及早发现特殊学生,对三类学生做到个性化关怀.因材施教. 预期成果:学生学习成绩提高10%,学生对大学惬意度提高20

Lucene的评分(score)机制研究

首先,需要学习Lucene的评分计算公式—— 分值计算方式为查询语句q中每个项t与文档d的匹配分值之和,当然还有权重的因素.其中每一项的意思如下表所示: 表3.5 评分公式中的因子 评分因子 描 述 tf(t in d) 项频率因子——文档(d)中出现项(t)的频率 idf(t) 项在倒排文档中出现的频率:它被用来衡量项的“唯一”性.出现频率较高的term具有较低的idf,出现较少的term具有较高的idf boost(t.field in d) 域和文档的加权,在索引期间设置.你可以用该方法

计算机类产品评标技术评分标准研究

评价标准 在计算机采购时,人们首先想到的三大件是:CPU性能.内存容量.显示器.由于显示器更新速度相对于CPU而言比较慢,同时,KVM的利用使得多台主机共用显示器的情况越来越多,所以,人们在采购计算机特别是服务器类的产品时,经常只评价主机的性能,因此,本文略过了与显示器相关的内容. (一)CPU的性能指标 CPU是整个计算机系统的核心,它往往是各种档次计算机的代名词,CPU的性能大致上反映出计算机的性能,因此它的性能指标十分重要.其主要指标有:    (1)主频:CPU的时钟频率(CPU Clo

Spring Transaction + MyBatis SqlSession事务管理机制研究学习

线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是涉及Mysql的一些重要参数的配置学习,以及Spring事务管理机制的学习,因为通过观察服务器日志,发现在这两部分的时候耗时比较严重,特别是进行mysql事务提交的时候,项目源码中使用了Spring的声明式事务,即通过@Transactional注解来控制事务的开启与提交,这两天看了一些关于Spring Transaction事务的一些文章,也debug了源码,总算有点

内容中心网络下的缓存替换机制研究

关于缓存替换机制的问题主要有: 1.当替换发生时,替换哪些数据比较合适? 对于这个问题,可以通过一些算法,计算出缓存中每个数据块的价值,每次替换价值最小的数据.关于如何计算缓存数据的价值问题将在下面进行介绍. 由于不同的节点可能存储相同的的数据,因而在替换数据时,不仅考虑当前路由器的状态,同时也通过缓存协同,在了解了周围路由器的信息后再做替换决策.而要实现缓存的协同,路由器中需要保存与它交互的路由器中的信息,比如,我们在每个路由器中建立一个索引表,它记录了与之交互的路由其中保存的缓存信息. 假如