设为首页 收藏本站
查看: 1014|回复: 0

[经验分享] solr多字段搜索,排序打分规则

[复制链接]

尚未签到

发表于 2016-12-16 10:01:11 | 显示全部楼层 |阅读模式
相信使用solr的很多同学安装结束之后就很少去探讨solr的一些实现机制了,例如打分机制、Solr DisjunctionMax多域搜索,例如多域联合搜索与直接多域boots求和结果是完全不同的,使用较复杂。
今天我们只是简单的讲一下多字段搜索和简单的打分机制,后续继续探讨一些solr的使用以及实现机制的问题。
首先我们讲一下solr的多字段搜索,举例来说,如果你使用solr来搜索,我们截取一小段参数来解释:

1http://www.gaoxueping.com:8080/solr/core_2/select?indent=on&version=2.2&q=products_name%3Ahello



%3A是UTF8编码,其中看到q参数,这个参数是query input,我们这里的搜索条件是products_name:hello,这里如果这样搜索会怎样呢:
1http://www.gaoxueping.com:8080/solr/core_2/select?indent=on&version=2.2&q=hello



其中这里没有指定具体字段,这里就会用到schema.xml中的defaultSearchField,这个是配置默认搜索字段的,我们这里例如设置:
1<defaultSearchField>name</defaultSearchField>



那么如果你没指定搜索字段,他会自动搜索这个name字段。
在使用多个条件进行查询时,Solr 可能返回满足所有条件的结构或者满足部分条件的结果。operator控制这一行为,operator 包含 AND 和 OR,AND 将返回满足所有条件的结果,OR将返回满足任一条件的结果。
在 schema.xml,使用solrQueryParser元素来控制使用 AND 还是 OR。默认 operator 的设置只在 lucene 查询时生效,对于 DisMax 和扩展的 DisMax 无效,DisMax 和扩展 DisMax 内部采用硬编码的方式使用了 OR 操作。
不过我们大部分时间使用AND

1<solrQueryParser defaultOperator="AND"/>



solr的index schema中,除了支持基本数值类型的field,还支持一些特别的field,比如较常用的CopyField。以下面的schema配置片断为例:我们这里就使用此字段来设置多字段搜索,okay,例如我们需要同时搜索name,first_name和address这三个字段,那么我们需要先在shema.xml中定义:
1<copyField source="products_name" dest="text"/>

2<copyField source="products_description" dest="text"/>

3<copyField source="categories_name" dest="text"/>



其中source就是我们已定义字段的值,这里我们还要为这个字段定义一下:
1<field name="text_rev" type="text_general_rev" indexed="true" stored="false" multiValued="true"/>



其中这个字段不需要可以不需要存储。
当然你可以将默认搜索字段设置为这个字段:

1<defaultSearchField>text</defaultSearchField>



okay,一切看起来是不是很美好了,但是这样做虽然解决了多字段搜索问题,但是权重问题无法达成。
使用Solr搭建搜索引擎很容易,但是如何制定合理的打分规则(boost)做排序却是一个很头痛的事情。Solr本身的排序打分规则是继承自Lucene的文本相关度的打分即boost,这一套算法对于通用的提供全文检索的服务来讲,已经够用了,但是对于一些专门领域的搜索来讲,文本相关度的打分是不合适的。
如何来定制适合自身业务的排序打分规则(boost)呢?经过这段时间的思考与实践,想到了如下三个方法:
1、定制Lucene的boost算法,加入自己希望的业务规则;
2、使用Solr的edismax实现的方法,通过bf查询配置来影响boost打分。
3、在建索引的schema时设置一个字段做排序字段,通过它来影响文档的总体boost打分。
上面每一种方法都有其优劣,下面分析一下各自的优劣。
第一种方法技术难度要求较高,需要读懂Lucene的boost打分算法,在代码层做定制.
第二种方式就简单不少,不过因为受限于edismax提供的方法,所以有些局限性。
第三种排序可完全消除文本相关性打分的影响,文本检索匹配逻辑只负责找到匹配的项,排序由自定义字段处理。
着重介绍一下通过使用Solr的DisMaxQParserPlugin通过配置来制定结果文档打分规则。
DisMaxQParserPlugin提供在针对文本boost打分上,支持搜索多个schema索引字段,并针对每一个字段设置不同的boost权限。
pf查询 与 qf查询
pf: 可提供对一条记录的多个字段做匹配的功能
qf: 针对查询的每个字段设置不同的boost权重打分,其设置的字段必须为在pf中配置的项。
可在solrconfig.xml中的browse中配置做如下配置:

1<requestHandler name="/browse" class="solr.SearchHandler">

2<lst name="defaults">

3<str name="defType">edismax</str>

4<str name="pf">

5name info title

6</str>

7<str name="qf">

8name^1 info^0.8 title^0.6

9</str>

10</lst>

11</requestHandler>



上面一段的意思是,查询name,info,title三个字段,每个字段的文本相关度打分权重分别为1,0.8,0.6。计算查询出的每一条结果的权重方法如下:分别计算各字段的文本打分然后乘于配置的权重,最后三者相加即为该结果的boost得分。
bf查询
除去pf查询,qf查询之外,仍然希望索引记录的其它字段能够计入打分中,这时可以使用bf查询。bf查询支持一些数据函数,这些函数可作用在索引记录的字段上,多为时间,数值等字段。同样bf也支持添加权重。下面是一个使用bf查询配置的例子:

1<requestHandler name="/browse" class="solr.SearchHandler">

2<lst name="defaults">

3<str name="defType">edismax</str>

4<str name="bf">

5sum(recip(ms(NOW,created_time),3.16e-11,1,1),sqrt(log(max(sales,1))),sqrt(log(count)))^10

6</str>

7<str name="pf">

8name info title

9</str>

10<str name="qf">

11name^1 info^0.8 title^0.6

12</str>

13</lst>

14</requestHandler>



其中sum,recip,ms,sqrt,log,max这些都是Solr提供的数学方法,支持的所有数学方法可在这里查找到:http://wiki.apache.org/solr/FunctionQuery
edismax相关资源:http://wiki.apache.org/solr/DisMaxQParserPlugin

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315037-1-1.html 上篇帖子: 全文检索学习及Apache SOLR的使用探索 下篇帖子: Solr的自动完成/自动补充实现及经验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表