Solr自定义排序
来源:互联网 发布:推荐等身大抱枕淘宝店 编辑:程序博客网 时间:2024/05/29 14:04
使用Solr搭建搜索引擎很容易,但是如何制定合理的打分规则(boost)做排序却是一个很头痛的事情。Solr本身的排序打分规则是继承自Lucene的文本相关度的打分即boost,这一套算法对于通用的提供全文检索的服务来讲,已经够用了,但是对于一些专门领域的搜索来讲,文本相关度的打分是不合适的。
如何来定制适合自身业务的排序打分规则(boost)呢?经过这段时间的思考与实践,想到了如下三个方法
1、定制Lucene的boost算法,加入自己希望的业务规则;
2、使用Solr的edismax实现的方法,通过bf查询配置来影响boost打分。
3、在建索引的schema时设置一个字段做排序字段,通过它来影响文档的总体boost打分。
上面每一种方法都有其优劣,下面分析一下各自的优劣。
4. 添加数据的时候对每个文档进行boost设置,来影响打分规则。
第一种方法技术难度要求较高,需要读懂Lucene的boost打分算法,在代码层做定制.
第二种方式就简单不少,不过因为受限于edismax提供的方法,所以有些局限性。
DisMaxQParserPlugin提供在针对文本boost打分上,支持搜索多个schema索引字段,并针对每一个字段设置不同的boost权限。
pf查询 与 qf查询
pf: 可提供对一条记录的多个字段做匹配的功能
qf: 针对查询的每个字段设置不同的boost权重打分,其设置的字段必须为在pf中配置的项。
可在solrconfig.xml中的browse中配置做如下配置:
bf查询
除去pf查询,qf查询之外,仍然希望索引记录的其它字段能够计入打分中,这时可以使用bf查询。bf查询支持一些数据函数,这些函数可作用在索引记录的字段上,多为时间,数值等字段。同样bf也支持添加权重。下面是一个使用bf查询配置的例子:
如何来定制适合自身业务的排序打分规则(boost)呢?经过这段时间的思考与实践,想到了如下三个方法
1、定制Lucene的boost算法,加入自己希望的业务规则;
2、使用Solr的edismax实现的方法,通过bf查询配置来影响boost打分。
3、在建索引的schema时设置一个字段做排序字段,通过它来影响文档的总体boost打分。
上面每一种方法都有其优劣,下面分析一下各自的优劣。
4. 添加数据的时候对每个文档进行boost设置,来影响打分规则。
第一种方法技术难度要求较高,需要读懂Lucene的boost打分算法,在代码层做定制.
第二种方式就简单不少,不过因为受限于edismax提供的方法,所以有些局限性。
第三种排序可完全消除文本相关性打分的影响,文本检索匹配逻辑只负责找到匹配的项,排序由自定义字段处理。
第四种局限性大,是在添加数据的时候就直接设置boost打分来影响全局的排序。
下面结合最近使用Solr的实践,着重介绍一下通过使用Solr的DisMaxQParserPlugin通过配置来制定结果文档打分规则。DisMaxQParserPlugin提供在针对文本boost打分上,支持搜索多个schema索引字段,并针对每一个字段设置不同的boost权限。
pf查询 与 qf查询
pf: 可提供对一条记录的多个字段做匹配的功能
qf: 针对查询的每个字段设置不同的boost权重打分,其设置的字段必须为在pf中配置的项。
可在solrconfig.xml中的browse中配置做如下配置:
<requestHandler name="/browse" class="solr.SearchHandler"><lst name="defaults"><str name="defType">edismax</str><str name="pf">name info title</str><str name="qf">name^1 info^0.8 title^0.6</str></lst></requestHandler>上面一段的意思是,查询name,info,title三个字段,每个字段的文本相关度打分权重分别为1,0.8,0.6。计算查询出的每一条结果的权重方法如下:分别计算各字段的文本打分然后乘于配置的权重,最后三者相加即为该结果的boost得分。
bf查询
除去pf查询,qf查询之外,仍然希望索引记录的其它字段能够计入打分中,这时可以使用bf查询。bf查询支持一些数据函数,这些函数可作用在索引记录的字段上,多为时间,数值等字段。同样bf也支持添加权重。下面是一个使用bf查询配置的例子:
<requestHandler name="/browse" class="solr.SearchHandler"><lst name="defaults"><str name="defType">edismax</str><str name="bf">sum(recip(ms(NOW,created_time),3.16e-11,1,1),sqrt(log(max(sales,1))),sqrt(log(count)))^10</str><str name="pf">name info title</str><str name="qf">name^1 info^0.8 title^0.6</str></lst></requestHandler>
其中sum,recip,ms,sqrt,log,max这些都是Solr提供的数学方法,支持的所有数学方法可在这里查找到:http://wiki.apache.org/solr/FunctionQuery
edismax相关资源:http://wiki.apache.org/solr/DisMaxQParserPlugin
以下是在添加数据的时候对每个文档的Boost进行修改,来影响打分,默认值为1,也可以在update时进行添加。
List<SolrInputDocument> docList = newArrayList<SolrInputDocument>();for(ShopDataModel shopDataModel : indexDataBeanList) { SolrInputDocument doc = newSolrInputDocument(); doc.setDocumentBoost(shopDataModel.getCoojin_fee());//核心代码,shopDataModel.getCoojin_fee()为放大倍数,此处为float类型 docList.add(doc);}CommonsHttpSolrServer solr = getSolrWriteConnection();solr.add(docList);solr.commit();此处不进行optimize操作,因为Solr中配置有自动合并。
- Solr自定义排序
- Solr打分排序规则自定义
- solr入门之自定义排序之构建自己的权重计算方法及相应的排序字段
- solr 自定义分词器
- solr自定义分词器
- solr 自定义Handler
- solr自定义core
- solr自定义分词器
- Solr自定义分词器
- solr自定义分词器
- solr null排序问题
- solr的随机排序
- solr 排序限制
- Solr&Lucene --- 排序
- solr多字段排序
- [solr]查询权重排序
- Solr评分排序机制
- solr入门之edismax权重排序使用之Java代码实现自定义权重
- 试探Galaxy的音频设计框架
- overridePendingTransition
- 【iPhone】网络编程
- Nginx-负载均衡
- android ListView 几个重要属性
- Solr自定义排序
- WIFI无线网络5G 5.8G(5.8GHz)频谱各信道及对应频率
- Direct2D中的2D显示
- SGU132 状态压缩~最优值
- linux下scp命令详解
- sizeof()用法汇总
- 什么是.do文件?
- android中activity的四种启动模式
- 使用百度地图离线JavaScript API加载本地瓦片地图