- 浏览: 592628 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
青春依旧:
html5教学哪家强!当然要上华清远见!
深入理解浏览器兼容性模式 -
ashur:
真机智,看得我都笑自己了
js 字符串转dom 和dom 转字符串 -
panghaoyu:
实现一个智能提示功能需要ajax、数据库、jsp/php、算法 ...
solr第一弹 autocomplete(自动补全) -
FakLove:
连线如何删除啊
基于html5 的拖拽连线 -
FakLove:
连线可以再删除吗?
基于html5 的拖拽连线
转自 http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html
Lucene 评分体系/机制(lucene scoring)是 Lucene 出名的一核心部分。它对用户来说隐藏了很多复杂的细节,致使用户可以简单地使用 lucene。但个人觉得:如果要根据自己的应用调节评分(或结构排序),十分有必须深入了解 lucene 的评分机制。
Lucene scoring 组合使用了 信息检索的向量空间模型 和 布尔模型 。
首先来看下 lucene 的评分公式(在 Similarity 类里的说明)
|
其中:
-
tf(t in d) 关联到项频率,项频率是指 项 t 在 文档 d 中出现的次数 frequency。默认的实现是:
tf(t in d) = frequency½
-
idf(t) 关联到反转文档频率,文档频率指出现 项 t 的文档数 docFreq。docFreq 越少 idf 就越高(物以稀为贵),但在同一个查询下些值是相同的。默认实现:
idf(t) = 1 + log ( numDocs ––––––––– docFreq+1 ) - coord(q,d) 评分因子,是基于文档中出现查询项的个数。越多的查询项在一个文档中,说明些文档的匹配程序越高。默认是出现查询项的百分比。
-
queryNorm(q)查询的标准查询,使不同查询之间可以比较。此因子不影响文档的排序,因为所有有文档都会使用此因子。默认值:
queryNorm(q) = queryNorm(sumOfSquaredWeights) = 1 –––––––––––––– sumOfSquaredWeights½ 每个查询项权重的平分方和(sumOfSquaredWeights)由 Weight 类完成。例如 BooleanQuery 地计算:
sumOfSquaredWeights = q.getBoost() 2 · ∑ ( idf(t) · t.getBoost() ) 2 t in q - t.getBoost()查询时期的 项 t 加权(如:java^1.2),或者由程序使用 setBoost()。
-
norm(t,d)压缩几个索引期间的加权和长度因子:
- Document boost - 文档加权,在索引之前使用 doc.setBoost()
- Field boost - 字段加权,也在索引之前调用 field.setBoost()
- lengthNorm(field) - 由字段内的 Token 的个数来计算此值,字段越短,评分越高,在做索引的时候由 Similarity.lengthNorm 计算。
以上所有因子相乘得出 norm 值,如果文档中有相同的字段,它们的加权也会相乘:norm(t,d) = doc.getBoost() · lengthNorm(field) · ∏ f.getBoost() field f in d named as t 索引的时候,把 norm 值压缩(encode)成一个 byte 保存在索引中。搜索的时候再把索引中 norm 值解压(decode)成一个 float 值,这个 encode/decode 由 Similarity 提供。官方说:这个过程由于精度问题,以至不是可逆的,如:decode(encode(0.89)) = 0.75。
计算这个评分涉及到几个核心的类/接口:Similarity、Query、Weight、Scorer、Searcher,由它们或其子类来完成评分的计算。先来看下它们的类图:
搜索中,评分的过程:
- 创建一个查询对象 Query,传给 Searcher,具体来讲可能是 IndexSearcher。
- Searcher 根据 Query 创建一个对应的 Weight(是 Query 的内部特征表示),接着 Weight 会创建对应的 Scorer。
- Searcher 会创建 Hitcollector 并传到 Scorer,scorer 找到匹配的文档并计算评分,最后写到 Hitcollector 中。
Query、Weight、Scorer 三都关系十分密切,尤其是 Query 和 Weight。Weight 是计算查询权重和创建 Scorer 的。Query 为了可以重用把内部的特征抽象为 Weight,由子类去完成一些相关评分的计算。
任何 Searcher 依赖的状态都存储在 Weight 实现中,而不是在Query 中,这样可以重用 Query。
Weight 的生命周期(被使用):
- Weight 由顶层的 Query 创建。Query.createWeight(Searcher),创建的 Weight 给 Searcher 去使用。
- 当用 Similarity.queryNorm(float) 来计算查询标准化因子(query normalization)的时候,Weight.sumOfSquaredWeights() 会被调用。
- 查询标准化因子(query normalization)会传给 Weight.normalize(float)计算,这个时候权重(weighting)计算完成。
- 创建一个 Scorer。
自定义评分的计算
可以实现一个 Similarity 换掉默认的。它仅限于 Scorer、Weight 计算好的因子值再加工。要想对评分有更强的控制力,可以实现一套 Query、Weight、Scorer。
- Query 是用户信息需要的抽象
- Weight 是 Query 的内部特性表示的抽象
- Scorer 抽象公用的计算评分功能,提供计算评分和解说(explanation)评分的能力。
Query 子类实现的方法:
- createWeight(Searcher searcher) -- Weight 是 Query 内部代表,所以每个 Query 都必实现一个 Weight,此方法就是生成一个Query对应的Weight对象。
- rewrite(IndexReader reader) -- 重写查询为原始的查询,原始的查询有:TermQuery,BooleanQuery……
Weight 接口方法:
- Weight#getQuery() -- 指出代表 Weight 的 Query。
- Weight#getValue() -- Query 的权重,例如:TermQuery.TermWeight 的 value = idf^2 * boost * queryNorm
- Weight#sumOfSquaredWeights() -- 各查询项的平方和,如,TermWeight 的 = (idf * boost)^2
- Weight#normalize(float) -- 决定查询标准化的因子,查询标准化值可以在不同 Query 比较 score
- Weight#scorer(IndexReader) -- 创建 Query 对应的评分器 Scorer,它的责任是给 Query 匹配到的文档评分。
- Weight#explain(IndexReader, int) -- 给指定的文档详细解说评分值是怎么得来了。
Scorer 子类实现的方法:
- Scorer#next() -- 预取匹配到的下一文档,有才返回 true。
- Scorer#doc() -- 返回当前匹配到的文档id,它必须 next() 调用后才有效。
- Scorer#score() -- 返回当前文档的评分,此值可以由应用程序以任何适当的方式给出,如 TermScorer 返回 tf * Weight.getValue() * fieldNorm
- Scorer#skipTo(int) -- 跳到大于或等于 int 的匹配文档上。很多情况下,在结果集中 skipTo 比较循环更加快速高效。
- Scorer#explain(int) -- 给出评分产生的细节。
要实现一套 Query、Weight、Scorer,最好还是看下 TermQuery、TermWeight、TermScorer。
当 Lucene 中没有想要的查询时(包括不同的评分细节),自定义Query 可能帮得上忙。
发表评论
-
HTML5 Server-Sent Events With Java Servlets Example
2014-05-15 15:21 1380Since the dawn of modern web ... -
集群中session同步解决方式
2014-04-06 18:19 1212集群中几种session同步解决方案的比较(转) 在集群中 ... -
Extjs 几个常用控件
2012-11-22 13:01 2326NumberField控件 整数,小数,数字限制 ... -
Flyweight Pattern(享元模式)
2012-03-29 11:43 1444享元模式的特点是,复用我们内存中已存在的对象,降低系 ... -
ThreadPoolExecutor
2011-11-19 10:52 1585ThreadPoolExecutor是 jdk 1.5 ... -
spring mvc 分发器(DispatcherServlet)
2011-11-12 16:58 2778spring mvc 与其他的mvc框架一样都是一种 ... -
编码问题
2011-11-02 15:38 829JSP页面中的pageEncoding和contentTyp ... -
request session servletconfig servletcontext分析
2011-10-14 14:30 2295HttpServletRequest,HttpServle ... -
solr DataimportHanler fileld 出现null
2011-09-08 09:58 1140I'm wo ... -
solr DataimportHanler 效率对比
2011-09-08 09:28 111:用solrj 的api 调用封装SolrInputDocu ... -
solr DataimportHanler
2011-09-03 09:36 1283大多数的应用程序将数据存储在关系数据库、xml文件中 ... -
solr/home是个什么东西
2011-07-19 16:44 1952一直不太明白solr home是个什么东西,每次都 ... -
lucene多索引上的搜索
2011-04-09 15:35 1433上代码 import org.apache.lucene.d ... -
solr第二弹 关于“新蛋” “当当” “京东” 产品搜索的实现假想(1)
2011-04-09 09:39 80资料目前正在整理,很快会贴上去,主要内容 ... -
solr第一弹 autocomplete(自动补全)
2011-04-08 16:15 7238百度和google中都有文字的自动补全 ... -
nutch 更新url.txt无法执行新的抓取
2010-04-19 16:59 1755nutch在使用中经常会修改url.txt中要抓取的目标网站 ... -
tomcat部署的三种方式
2010-04-06 10:19 1444长时间习惯于myeclipse部署tomcat竟然把最基本的 ... -
nutch配置详解
2010-03-11 16:47 3390配置软件: 1、 Java jd ... -
WebLogicDeployableObject' may not be null的问题
2009-11-11 16:23 2564第一次用weblogic 出现了一个很奇怪的问题,按 ...
相关推荐
Solr 评分整理汇总是指 Solr 中的评分机制,该机制是继承自 Lucene 的文本相关度的打分,即 boost。这一套算法对于通用的提供全文检索的服务来讲,已经够用了,但是想要根据实际业务需求定制自己的打分机制来获取...
首先,我们需要了解Solr的评分(Score)机制。Solr的默认评分是基于TF-IDF(词频-逆文档频率)算法的,它会根据查询词在文档中的出现频率和在整个索引中的普遍程度来计算相关性。然而,这种默认设置可能并不完全符合...
总结来说,"solr自定义评分组件demo.zip"是一个帮助开发者理解并实践Solr自定义评分机制的实例。通过学习和应用这个示例,你可以根据具体业务需求定制更符合实际的评分策略,从而提升Solr搜索服务的效果。
通过分析Solr 6.2.0的源码,我们可以深入了解其内部工作机制,包括索引构建、查询处理、分布式协调等核心模块。源码中包含了丰富的注释和示例,帮助开发者深入理解Solr的设计思想和实现细节。 总结来说,Solr 6.2.0...
对于大型企业或者需要处理大量数据的场景,Solr 6.2.1提供了强大的搜索能力,包括拼写纠错、同义词处理、评分机制等,能有效提升用户体验。同时,其丰富的API和社区支持,使得定制化需求得以满足。总之,Solr 6.2.1...
Solr能够对大量数据进行快速的全文检索,同时支持多字段排序、分面搜索和自定义评分策略。为了保持索引与源数据的一致性,Solr引入了DIH,这是一个内建的机制,用于从关系数据库、XML文件等外部数据源导入数据,并将...
查询解析器负责将用户的输入转化为Solr可以理解的查询语言,而排序机制则允许用户根据特定字段或评分对搜索结果进行排序。 2. **Solr服务器**:Solr服务器是运行Solr应用的载体,通常使用Jetty或Tomcat等Web服务器...
3. **查询优化**:Solr会根据查询条件和索引结构自动优化查询计划,包括使用倒排索引来快速定位匹配文档,以及对查询结果进行评分排序。 4. **高亮显示**:Solr能够对查询结果中的匹配词进行高亮,提高用户查找相关...
Solr内置了多种缓存机制,如查询结果缓存、文档缓存、过滤器缓存等,以提高查询速度和系统性能。 1.2.6 复制 Solr支持数据复制,确保在主节点故障时,数据不会丢失,保持服务的高可用性。 1.2.7 管理接口 Solr...
Apache Solr 是一个开源的全文检索引擎,由 Apache 软件基金会开发并维护...Solr 1.4.1版本虽然相对较旧,但其基本原理和架构在后续版本中依然保持一致,理解这个版本可以帮助我们更好地理解全文检索和Solr的工作机制。
在特性方面,Solr不仅利用了Lucene的强大搜索能力,还增加了如Schema模式定义、多种查询选项、核心管理和缓存机制等高级特性。Schema允许用户自定义数据模型,包括字段类型、复制字段和动态字段,以适应不同业务需求...
Solr在Lucene的基础上构建了一个完整的搜索平台,包含了如HTTP接口、XML/JSON响应格式、多文档类型支持、分布式搜索、缓存机制等高级特性。Solr的架构设计使其能够处理大量数据,支持水平扩展,并且提供了一套完整的...
文档中提供了 Solr 搜索机制的总体概述,包括查询解析、评分算法等关键技术点。 #### Velocity 搜索 UI Velocity 搜索 UI 是 Solr 提供的一种可视化搜索界面,便于用户进行交互式搜索。 #### 相关性 文档中介绍...
6. **扩展性与定制化**:Solr允许通过插件机制进行扩展,比如自定义查询解析器、过滤器、排序策略等,以满足特定的业务需求。此外,Solr还可以集群部署,实现分布式搜索和高可用性。 在实际应用中,Solr搜索插件...
1. **Solr的基本概念**:了解什么是索引、查询处理、分词器、过滤器、评分机制等核心概念,它们是构建Solr搜索系统的基础。 2. **安装与部署**:Solr的下载、解压、启动和停止过程,以及如何配置Solr服务器,包括...
6. **排序和评分**:Solr可以根据相关性、时间戳或其他自定义因素对搜索结果进行排序,同时提供评分机制,帮助用户优先展示最相关的结果。 7. **分片和复制**:Solr支持数据的分片和复制,这在处理大规模数据时尤为...
3. **排序与评分**:Solr可以根据多种因素(如相关性、日期、自定义函数)对搜索结果进行排序,并提供TF-IDF等评分机制。 4. **高亮显示**:搜索结果中的关键词可以被高亮,方便用户快速定位匹配内容。 5. ** ...
- **排序和评分**: 结果可以按照相关度、时间或其他自定义方式排序,并且有内置的TF-IDF评分机制。 - **分面导航**: 提供分面统计,帮助用户在大量结果中快速筛选。 - **拼写纠正**: 自动检测并提供拼写建议,...