自定义评分器Similarity,提高搜索体验

 
首先说一下lucene对文档的评分规则:

 

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;如下自定义的评分器

 

 

 

view plaincopy to clipboardprint?

  1. /** 
  2.  * @author yuzhy 
  3.  * 实现自已的评分器 
  4.  * 文档中重复多少个词不影响分数 
  5.  * 
  6.  */  
  7. public class MySolrSimilarity extends DefaultSimilarity {  
  8.     @Override  
  9.     public float tf(float freq) {  
  10.         return 1.0f;  
  11.     }  
  12.     @Override  
  13.     public float tf(int freq) {  
  14.         return 1.0f;  
  15.     }  
  16.       
  17.       
  18. }  

/**
* @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在文档出现的频率并不影响,即是不用担心作弊的情况,因为在这方面上他们的分数都是一样的。之前还考虑了对标题与标签的重复字符串的处理,采用后缀树结构来处理公共子串,后来发现这种方法来得更简洁。

因为使用的是solr来作搜索服务来架构,所以首先修改solr默认的Similarity类。在solr 的配置文件schemal.xml,最后中修改或增加:

 

<similarity class="com.wole.solr.search.MySimilarity"/>

 

设置为自定义的评分器,重启solr服务后,自定义的评分器就生效了。搜索" 美女"后,不再出现“美女美女美女美女”文档靠前排的效果了。

 

 

 

接着说一下coord的影响:

搜索“htc Incredible S” 三个词,由于没有这完全命中,则使用了宽松规则,即命中一个词也返回进行排序,之前的评分,前几条的结果为:

 

view plaincopy to clipboardprint?

  1. <doc>  
  2. <str name="Subject">S.H.E爱而为一的魔力 幕后全纪录</str>  
  3. <str name="tag">she selina hebe ella 爱而为一</str>  
  4. <int name="public_time">1103150000</int>  
  5. <int name="times">370</int>  
  6. <int name="hd">1</int>  
  7. </doc>  
  8. −  
  9. <doc>  
  10. <str name="Subject">1000种死法-S04-01.1024X576.x264</str>  
  11. <str name="tag">1000种死法    </str>  
  12. <int name="public_time">1103140000</int>  
  13. <int name="times">692</int>  
  14. <int name="hd">1</int>  
  15. </doc>  
  16. −  
  17. <doc>  
  18. <str name="Subject">p-s-1</str>  
  19. <str name="tag">    </str>  
  20. <int name="public_time">1103150000</int>  
  21. <int name="times">58</int>  
  22. <int name="hd">1</int>  
  23. </doc>  

<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占更大的比例值,效果马上出来更好的,其前三条记录为:

 

view plaincopy to clipboardprint?

  1. <doc>  
  2. <str name="Subject">不可思议htc Incredible 对比 apple iphone4</str>  
  3. <str name="tag">Incredible htc apple iphone4 苹果</str>  
  4. <int name="public_time">1009250000</int>  
  5. <int name="times">29758</int>  
  6. <int name="hd">0</int>  
  7. </doc>  
  8. −  
  9. <doc>  
  10. <str name="Subject">不可思议 htc Incredible 比拼 苹果 iphone 3gs</str>  
  11. <str name="tag">不可思议 Incredible htc 苹果 apple</str>  
  12. <int name="public_time">1009250000</int>  
  13. <int name="times">20231</int>  
  14. <int name="hd">0</int>  
  15. </doc>  
  16. −  
  17. <doc>  
  18. <str name="Subject">HTC incredible拆解全过程</str>  
  19. <str name="tag">手机 HTC incredible DROID系列 </str>  
  20. <int name="public_time">1005030000</int>  
  21. <int name="times">3649</int>  
  22. <int name="hd">0</int>  
  23. </doc>  

<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 ,使命中越多词分数越高的效果

时间: 2024-08-29 19:14:07

自定义评分器Similarity,提高搜索体验的相关文章

提高搜索体验 苹果收购应用搜索引擎Chomp

目前,http://www.aliyun.com/zixun/aggregation/11066.html">苹果应用商店的已经超过50万款,应用下载量已接近250亿次.在应用浩瀚如海的今天,如何找到自己喜欢的应用已经变得越来越困难.为了解决这个问题,苹果刚刚收购了应用搜索引擎Chomp.此次收购交易的详情目前还不清楚. 作为一款应用搜索引擎,Chomp目前已经推出iPhone和Android应用.近期,Chomp还就Android应用的搜索与Verizon达成了合作协议,随着这次收购的完

Lucene 3.6.2入门(8) 高级搜索之自定义评分

  package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.util.Random; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; i

CC视频使用技巧:如何设置个性播放器提高用户体验

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 根据我们的调查发现,CC视频70%的客户使用的是默认的6186.html">播放器设置,其中很多客户的播放器样式和网站样式不统一,播放器在页面中显得很突兀,用户体验非常差,不利于网站推广. 今天我们将为大家讲解如何设置个性播放器提高用户体验. 首先登录CC视频管理后台,点击播放器管理: 1,皮肤选择 在这里我们可以选择自己需要

站长靠什么留住用户,提高用户体验

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 要想提高网站的权重,首先就要做好网站内容,用内容的精辟性来提高用户体验满意度.何为用户体验满意度,就是要留住老顾客,增加新访客让新访客变成老访客.这就是用户体验满意度,只用户喜欢上自己的网站,觉得自己的网站对他们来说有意义,可以帮得到他们,这样他们自然而然会记住自己的网站名称或网址,有的更甚者直接收藏到收藏夹,以免丢失找不到了哦. 只有做成这

再谈关于提高用户体验的方法

比如XXX博客排名再百度第5名,这时候用户搜索XXX,点击第一个查看发现不是自己要找的,就关闭页面,点击第二个,不是,关闭,点击第三个.....知道点击第五个,发现是用户自己要找的博客,然后停下来浏览,这个时候搜索引擎(本文只针对百度)会默认这个用户搜素行为是正确的并有效的,并可用以判断XXX博客才是对XXX关键词用户最有价值的网站. 上面的说法只说对了一半,也许那位作者是匆忙写文字的原因就没有分析到位.为什么我说知说对了一半呢,听我给你分析. 首先,上面的案例是说按顺序点击,但是实际情况往往是

提高用户体验的优化方案

摘要: 一般的站长建站都是从网络上下载程序源代码.现时代讲究的是高速效率.所以,一分钟建站也相应而生了.对于网络上下载的程序,大部分都是官网的原有模板和内容,自然自己要做 一般的站长建站都是从网络上下载程序源代码.现时代讲究的是高速效率.所以,一分钟建站也相应而生了.对于网络上下载的程序,大部分都是官网的原有模板和内容,自然自己要做的话要花费一番功夫去修改设置了.而对于网站的基本功能之类的设置则是关系着能否粘住用户并且让用户参考推广中来,放眼看看一些大站都特别的注重网站的功能方面,一键式分享.一

增加网站人文关怀提高用户体验

今天想说的是增加网站人文关怀提高用户体验,何谓"人文关怀"呢?大致可以解释如下: "人文关怀",普通人的理解很简单,就是对人的关怀."人文"是一个内涵极其丰富而又很难确切指陈的概念,"人文"与人的价值.人的尊严.人的独立人格.人的个性.人的生存和生活及其意义.人的理想和人的命运等等密切相关. 好了,了解了这些东西,我们就应该对此有一个初步的认识,我们要做的就是将网站与人文关怀有机的结合. 我们研究的步骤是:提出问题--分析问题

手机客户端搜索引擎:提升用户在移动端的搜索体验

文章描述:简单页面的华丽变身-Search App Product Design. 网页端搜索引擎的简单易用一直是网页产品设计中的优秀范例. 它巧妙地利用大片留白,一个搜索框入口,链接排布形式和品牌LOGO的互相搭配,在一个页面里为用户提供了绝佳的用户体验.强大的产品特性也使其成为上网冲浪必不可少的工具之一,帮助用户挖掘到未知的网络世界. 随着移动互联网的快速发展,移动信息量也迅猛膨胀,用户对手机搜索引擎的需求也与日俱增.因此搜索引擎也纷纷开始酝酿自己的手机产品.和PC机相比,手机端硬件更加局限

搜索体验优化,进入Seo3.0

随着互联网技术的不断发展,每个网站的建立者都希望利用搜索引擎的搜索规则,来提高自己建立的网站在有关搜索引擎内的排名.现在的SEO不断发展,已经从当初单纯的搜索引擎逐步转向搜索体验优化.用户不仅要从内容上得到满足,视觉的满足也是必不可少的.如何经营好一个网站,是每个建站者在经营网站时必须面对的问题.要想很好的解决好这个问题,网站建立者就应该从不同方面着手,去改进自己的网站,主要是对用户的体验进行优化.为了能够让网站的建立者能够更好的运营自己的网站,下面笔者我将从几个方面进行分析,让大家能够更好的了