`

solr多字段搜索,排序打分规则

    博客分类:
  • solr
阅读更多

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

1 http://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,这里如果这样搜索会怎样呢:

1 http://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">
5 name info title
6 </str>
7 <str name="qf">
8 name^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">
5 sum(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">
8 name info title
9 </str>
10 <str name="qf">
11 name^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

分享到:
评论

相关推荐

    solr实现电商自定义打分

    通过solr实现电商搜索排名打分,排序,可自定义打分规则

    基于java-solr-geo空间坐标搜索、距离排序、分页

    基于solr-geo空间搜索 1、Solr的schema.xml配置 定义坐标field 2、Solr的data-config.xml配置 建立索引 3、java查询语法 坐标距离、分页、排序

    Solr reRank简介

    Solr reRank简介,用于描述solr二次排序的规则,Solr reRank简介,用于描述solr二次排序的规则

    solr 搜索短语搜索不出来的解决方案

    NULL 博文链接:https://ldcsunnyboy.iteye.com/blog/1113251

    solr技术分析及运用超详细教程

    solr技术分析及运用超详细教程solr开发指南,包括solr服务器搭建,新增数据库配置,配置增量更新,配置分词器,常见异常,删除默认字段,调试技巧,solr日志,,solr基本查询语法,solr多字段匹配,solri集成solr...

    solr 企业搜索引擎教程

    更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。 通过对 Solr 进行适当的配置, 某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此 外,很多 Lucene 工具(如 Nutch、...

    solr.war包solr.war包solr.war包solr.war包solr.war包

    solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...

    ES和solr搜索方案对比

    ES和solr都是基于Lucence的搜索框架,文档比较2中方案适合的不同场景和优劣

    solr文档解说吧

    solr文档解说

    solr服务器_solr_

    solr

    solr配置搜索引擎平台

    solr配置搜索引擎平台 一、 SOLR搭建企业搜索平台 二.... 三,,,,

    java进阶Solr从基础到实战

    Solr它是一种开放源码的、基于 Lucene 的搜索服务器,可以高效的完成全文检索的功能。在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一...

    solr

    solr

    SOLR的应用教程

    2.3.2 为何使用多core ? 23 2.4 配置文件说明 23 2.4.1 schema.xml 24 2.4.2 solrconfig.xml 25 3 Solr的应用 29 3.1 SOLR应用概述 29 3.1.1 Solr的应用模式 29 3.1.2 SOLR的使用过程说明 30 3.2 一个简单的例子 30...

    企业级搜索引擎solr教程

    tomcat7下实现solr4.3的部署与配置,配置中文服务器。通过solrj实现索引的创建,修改,删除,查询。并实现httpclienct创建、修改索引,检索信息等。

    SSM+spring-data-solr+solr7.7 全文搜索代码

    JAVA语言,实现SSM+SQL Server 数据库整合,通过spring-data-solr框架实现与solr平台的互通,实现全文搜索功能,亲测,完全了可以用

    solr文档solr文档

    solr文档

    已编译版本solr-8.11.2.tgz

    他的主要特性包括:高效,灵活的缓存功能,垂直搜索功能,高亮下试搜索结果,通过索引复制来提高可用性,提供一套强大的data schema 来定义字段,类型和设置文本分析,提供基于web的管理界面等。

    solr5.4.0完整包

    Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的...

    Solr实现电扇站内搜索

    Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索

Global site tag (gtag.js) - Google Analytics