- 浏览: 348067 次
- 来自: NA
文章分类
最新评论
-
上官车月:
实验成功,转载了
Java获取请求客户端的真实IP地址 -
url_nc:
very good
css教程–十步学会用css建站(全) -
hiveer:
楼主我想问能不能不在class里面定义get_binding ...
强大的ruby模版:ERB -
ilovebaby0530:
修改密码后需要 FLUSH PRIVILEGES;
绿色版mysql安装步骤 -
albrich:
你这个方法也是不行的,得到的仍然是内网的IP
Java获取请求客户端的真实IP地址
http://www.gbsou.com/2011/11/01/8048.html
score(q,d) = coord(q,d) · queryNorm(q) · | ∑ | ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d) ) |
具体可以查看相关文章:http://blog.chenlb.com/2009/08/lucene-scoring-architecture.html
这里先考虑三个因素coord(q,d)与tf(t in d),当查询串中,命中的词越多,coord计算的值则越大,某个词在文档中出现的次数越多则tf的值越大。还有就是norm(t,d),这个主要是文档 boost与字段boost的影响。值越大,对整体评分的影响越重。
首先说tf对搜索结果的影响:
这里是在于本站使用的搜索评分开始是默认的评分器的情况下,但发 现有些不足之处。因为站内搜索主要是视频的标题与标签。对于一个视频文档来说,标题或者与标签重复的词本身就是无意义的,比如标题为”美女美女美女美 女”,标签为“美女”,如果让tf 的作用变大,明显示会使得它的评分更大,而其实并不是视频网站想要的效果。因为我们更想让它更加发散,这样,用户的点击率才会高。所以我们应该让所有命中 词的文档的tf 不受频率的影响,使其tf=1.0f;如下自定义的评分器
- /**
- * @author yuzhy
- * 实现自已的评分器
- * 文档中重复多少个词不影响分数
- *
- */
- public class MySolrSimilarity extends DefaultSimilarity {
- @Override
- public float tf( float freq) {
- return 1 .0f;
- }
- @Override
- public float tf( int freq) {
- return 1 .0f;
- }
- }
别小看这段代码 ,因为使用这种评分,对于一个文档来说,一个term在文档出现的频率并不影响,即是不用担心zuobi的情况,因为在这方面上他们的分数都是一样的。之前还考虑了对标题与标签的重复字符串的处理,采用后缀树结构来处理公共子串,后来发现这种方法来得更简洁。
因为使用的是solr来作搜索服务来架构,所以首先修改solr默认的Similarity类。在solr 的配置文件schemal.xml,最后中修改或增加:
<similarity class=”com.wole.solr.search.MySimilarity”/>
设置为自定义的评分器,重启solr服务后,自定义的评分器就生效了。搜索” 美女”后,不再出现“美女美女美女美女”文档靠前排的效果了。
接着说一下coord的影响:
搜索“htc Incredible S” 三个词,由于没有这完全命中,则使用了宽松规则,即命中一个词也返回进行排序,之前的评分,前几条的结果为:
- < doc >
- < str name = “Subject” > S.H.E爱而为一的魔力 幕后全纪录 </ str >
- < str name = “tag” > she selina hebe ella 爱而为一 </ str >
- < int name = “public_time” > 1103150000 </ int >
- < int name = “times” > 370 </ int >
- < int name = “hd” > 1 </ int >
- </ doc >
- −
- < doc >
- < str name = “Subject” > 1000种死法-S04-01.1024X576.x264 </ str >
- < str name = “tag” > 1000种死法 </ str >
- < int name = “public_time” > 1103140000 </ int >
- < int name = “times” > 692 </ int >
- < int name = “hd” > 1 </ int >
- </ doc >
- −
- < doc >
- < str name = “Subject” > p-s-1 </ str >
- < str name = “tag” > </ str >
- < int name = “public_time” > 1103150000 </ int >
- < int name = “times” > 58 </ int >
- < int name = “hd” > 1 </ int >
- </ doc >
可以看到,命中的词S 的文档给排到较前,本应该让命中越来的词的文档分数更高,但因为这三个文档在其它方面影响到评分,使得它的最后分数高于命中多个词的文档,而排到最前,所 以这样的搜索体验不够好,好的体验应该是让命中的词越多排得越高,所以我首先降低计算norm(t,d)的值。测试调了其权重值,让coord占更大的比 例值,效果马上出来更好的,其前三条记录为:
- < doc >
- < str name = “Subject” > 不可思议htc Incredible 对比 apple iphone4 </ str >
- < str name = “tag” > Incredible htc apple iphone4 苹果 </ str >
- < int name = “public_time” > 1009250000 </ int >
- < int name = “times” > 29758 </ int >
- < int name = “hd” > 0 </ int >
- </ doc >
- −
- < doc >
- < str name = “Subject” > 不可思议 htc Incredible 比拼 苹果 iphone 3gs </ str >
- < str name = “tag” > 不可思议 Incredible htc 苹果 apple </ str >
- < int name = “public_time” > 1009250000 </ int >
- < int name = “times” > 20231 </ int >
- < int name = “hd” > 0 </ int >
- </ doc >
- −
- < doc >
- < str name = “Subject” > HTC incredible拆解全过程 </ str >
- < str name = “tag” > 手机 HTC incredible DROID系列 </ str >
- < int name = “public_time” > 1005030000 </ int >
- < int name = “times” > 3649 </ int >
- < int name = “hd” > 0 </ int >
- </ doc >
这里命中两个词htc Incredible的文档给排到最前面来,显然这才更符合用户需要的。即使没有完全命中,它的相关性会更逼近。
最后讲一下norm(t,d):
没有norms 意味着
索引阶段禁用了文档boost 和域的boost 及长度标准化。好处在于节省内存,不用在搜索阶
段为索引中的每篇文档的每个域都占用一个字节来保存norms 信息了。但是对norms 信息
的禁用是必须全部域都禁用的,一旦有一个域不禁用,则其他禁用的域也会存放默认的
norms 值。因为为了加快norms 的搜索速度,Lucene 是根据文档号乘以每篇文档的norms
信息所占用的大小来计算偏移量的,中间少一篇文档,偏移量将无法计算。也即norms 信
息要么都保存,要么都不保存。
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 |
搜索组件为dismax,其中文档bf的计算是由三个字段
public_time (视频发布时间)^15,times(视频播放数)^15,hd(视频高清)^4
字段的bf值为
qf=Subject^1+tag^0.3
如果想让coord的值靠前,计算文档 boost 与字段boost 的值应该降低一个级别。
改为:
public_time (视频发布时间)^1.5,times(视频播放数)^1.5,hd(视频高清)^0.4
这样 norm计算的值就远远小于 coord ,使命中越多词分数越高的效果
norm(t,d) = doc.getBoost() · lengthNorm(field) · | ∏ | f.getBoost() |
field f in d named as t |
发表评论
-
Apache Solr 实现去掉重复的搜索结果
2011-11-04 20:40 2052打上SOLR-236_collapsing.patch补丁, ... -
Apache Solr schema.xml及solrconfig.xml文件中文注解
2011-11-04 20:39 1989schema.xml位于solr/conf/目录下,类似于数据 ... -
Solr的扩展(Scaling)以及性能调优
2011-11-04 20:16 3212当你的索引数量越来 ... -
lucene下的contrib包介绍
2010-09-10 18:23 2516analyzers 下分为两个包 ... -
构建可伸缩,高性能的互联网应用(copy from http://yuquan-nana.javaeye.com/blog/710302)
2010-07-12 13:31 2003时间过得很快,来淘宝已经两个月了,在这两个月的时间里,自己也感 ... -
实时检索系统Zoie实现分析
2010-05-11 14:19 5079实时检索系统Zoie实现分析 实时检索的核心原理 通 ... -
ImageMagick, JMagick安装、配置(windows版)
2009-09-29 21:55 5446ImageMagick, JMagick安装、配置(windo ... -
使用HttpClient4.0调用JavaEye API
2009-09-19 21:22 2507package com.javaeye.client; ... -
spam搜索引擎垃圾技术的统称
2009-07-24 13:53 859在搜索引擎优化 ... -
使用org.apache.commons.net.ftp包开发FTP客户端,实现进度汇报,实现断点续
2009-03-12 11:06 5031利用org.apache.commons.net.ftp包实现 ... -
Java的Excel报表开源工具
2008-12-24 20:25 2483http://jdkcn.com/entry/opensour ... -
Apache Commons工具集简介
2008-12-09 12:11 1963Commons BeanUtils http://jakart ... -
Apache开源项目分类列表
2008-11-03 16:41 2221分类 项目名 说明 开发语言 服务器 ... -
JDK5多线程框架java.util.concurrent
2008-10-30 17:59 3851JDK5中的一个亮点就是将Doug Lea的并发库引入到Jav ... -
Java处理图片
2008-10-05 13:08 2185图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利 ... -
XFire 入门
2008-09-11 15:17 1157http://www.ibm.com/developerwor ... -
如何查看网站被百度或者google收录多少网页?
2008-08-09 02:16 4899在google或者百度的搜索框输入: site:www.ite ... -
分布式计算开源框架Hadoop介绍
2008-08-07 14:21 1535作者 岑文初 发布于 2008年8月4日 ...
相关推荐
在搜索引擎技术中,Apache ...通过深入理解评分机制并有效地利用自定义评分,我们可以构建出更符合用户期望的搜索系统,提升用户体验。在实践中,不断优化和测试自定义评分策略,以找到最适合业务场景的最佳解决方案。
本示例将通过"solr自定义评分组件demo.zip"介绍如何在Solr中自定义评分策略,以优化搜索体验。 首先,让我们理解Solr的默认评分机制。Solr基于TF-IDF(词频-逆文档频率)算法来计算文档与查询的匹配度,得分越高...
在电商领域,搜索结果的排序和打分对于用户体验至关重要,因为它直接影响到商品的展示顺序,进而影响到销售。本篇文章将详细介绍如何利用Solr实现电商自定义打分机制。 首先,我们需要了解Solr的评分(Score)机制...
为了自定义评分公式,Lucene提供了一些接口,如`similarity`和`similarity.Similarity`。你可以创建自己的相似度类,覆盖这些方法来改变TF、DF或IDF的计算方式,或者添加新的评分因子。例如,你可以实现一个更注重...
描述中提到的"Score documents using embedding-vectors dot-product or cosine-similarity",是指使用嵌入向量的点积或余弦相似度来对文档进行评分。这是一种衡量两个向量之间相似性的常用方法。点积越大,表示两个...
在Lucene 5版本中,对于搜索结果的排序和评分机制进行了优化,使得搜索体验更加精准。本文将深入探讨Lucene5中的评分(Scoring)机制,帮助读者理解如何通过源码分析和工具使用来提升搜索质量。 首先,我们需要了解...
在Lucene中,这些因素被封装在`Similarity`类中,开发者可以通过自定义`Similarity`子类来调整评分策略。例如,可以修改TF的计算方式,或者实现自己的IDF模型。 除了默认的评分机制,Lucene 还提供了一些高级特性,...
- **自定义评分**:通过Similarity类实现自定义评分算法。 - **查询改写**:QueryParser的QueryRewriter可以改进用户输入的查询表达式。 - **近实时搜索**:通过NRTManager实现近乎实时的搜索体验。 总之,Lucene ...
4. Similarity:自定义相似性算法可以根据业务需求调整评分机制,如TF-IDF、BM25等。 5. Join操作:虽然Lucene本身不支持JOIN,但通过DocValues或ExternalFileSorter等技术,可以实现跨文档的相关联查询。 四、...
此外,还可以通过自定义评分函数(Similarity)来优化相关性计算。 5. **高亮显示**:Lucene提供高亮功能,可以突出显示搜索结果中匹配的关键词,增强用户体验。 6. **扩展性**:Lucene本身只是一个核心库,不包含...
- Lucene允许开发者自定义Analyzer、Similarity、Filter等,以满足特定的搜索需求。 7. **多语言支持**: - Lucene提供对多种语言的文本处理支持,如中文、法文、德文等,通过选择合适的Analyzer。 8. **内存和...
- **评分器(Similarity)**:定义了如何根据文档的相关性对搜索结果进行排序,可以自定义实现以适应特定需求。 3. **高级特性** - **多字段搜索**:允许在多个字段上进行查询,通过设定字段权重来调整不同字段的...
协同过滤算法是一种广泛应用于推荐系统中的技术,尤其在电影推荐领域。这种算法的基本思想是,如果用户A和用户B在过去对某些电影的评分有相似的倾向...这种技术在现代信息时代对于提高用户体验和商业价值具有重要意义。
5. **高亮显示**:可以将搜索关键词在结果文档中高亮显示,提高用户体验。 二、主要功能 1. **索引构建**:从各种数据源(如文件、数据库等)读取内容,创建索引结构。 2. **索引更新**:支持增量索引,仅对变动...
4. 自定义评分函数:通过实现自定义的Similarity类,可以调整评分策略,满足特定的搜索需求。 总结,Lucene作为一款强大的全文检索库,不仅提供了高效的索引和搜索功能,还具有高度的灵活性和可扩展性,使得开发者...
这个版本包含了之前在某些下载源中可能缺失的高亮包,使得用户可以在搜索结果中实现关键词高亮,从而提高用户体验。高亮功能在信息检索中尤为重要,因为它能帮助用户快速识别和理解搜索关键词在文档中的位置和上下文...
【Lucene 结果排序原理】 Lucene 是一个流行的全文搜索引擎库,其结果排序是通过复杂的算法来实现的,旨在提供最相关的搜索结果。...理解这些原理和机制对于优化搜索体验和开发高级搜索引擎功能至关重要。
6. 扩展性强:允许自定义Analyzer、Filter、Similarity等,以满足特定需求。 总结来说,Lucene.NET 1.4.3是一个强大的全文检索库,它提供了一整套工具,帮助开发者轻松实现复杂的信息检索功能。通过理解其核心概念...
Lucene利用`RAMDirectory`和`MMapDirectory`等实现内存和磁盘缓存,提高搜索性能。`FilterCache`和`TermQueryCache`等缓存策略优化了查询速度。 7. **多线程与并发** Lucene在设计时考虑了多线程环境,`...
开发者还可以通过定制Similarity类来调整评分算法,以满足特定场景的需求。 除了基础的索引和查询功能,Lucene还提供了丰富的高级特性。例如,它支持多字段索引,可以在不同的字段上执行独立的查询;支持文档的更新...