`

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实现电商自定义打分机制。 首先,我们需要了解Solr的评分(Score)机制...

    Solr评分整理汇总.docx

    Solr 的 DisMaxQParserPlugin 通过配置来制定结果文档打分规则,提供在针对文本 boost 打分上,支持搜索多个 schema 索引字段,并针对每一个字段设置不同的 boost 权限。 在 Solr 中,文档得分是一个用来描述查询...

    solr导航搜索工具+文档+配置代码

    5. 自定义排序和评分:用户可以根据需求定制排序规则和评分机制,提升搜索结果的相关性。 6. 多语言支持:Solr内置了多种语言的分词器,能够处理多种语言的搜索请求。 二、Solr的基本架构 Solr架构主要由以下组件...

    solr实现京东搜索

    除了基本功能,Solr还可以实现如拼音搜索、同义词扩展、高亮显示搜索结果、相关性评分等高级特性,进一步提升用户体验。例如,通过添加拼音分析器,用户可以用汉字拼音进行搜索;利用Solr的自定义相似度函数,可以...

    solr搜索引擎的使用介绍

    3. **排序与评分**:Solr可以根据多种因素(如相关性、日期、自定义函数)对搜索结果进行排序,并提供TF-IDF等评分机制。 4. **高亮显示**:搜索结果中的关键词可以被高亮,方便用户快速定位匹配内容。 5. ** ...

    solr-6.2.0源码

    5. 自定义排序和评分:用户可以自定义文档排序规则和评分算法,以满足特定的业务需求。 6. 多语言支持:Solr内置了多种语言分析器,支持不同语言的全文搜索。 7. 高亮显示:Solr可以高亮显示搜索结果中的关键词,...

    solr文档solr文档

    1. **Solr的基本概念**:了解什么是索引、查询处理、分词器、过滤器、评分机制等核心概念,它们是构建Solr搜索系统的基础。 2. **安装与部署**:Solr的下载、解压、启动和停止过程,以及如何配置Solr服务器,包括...

    solr search

    4. 排序与评分:通过TF-IDF算法,Solr可以自动计算文档与查询的相关度,根据相关度进行排序。 5. 高亮显示:搜索结果中关键词可以被高亮,帮助用户快速定位匹配部分。 6. 聚类与分类:Solr提供基于文档内容的聚类和...

    solr搜索插件

    Solr不仅支持简单的关键词查询,还包含了丰富的文本分析、排序、分面搜索、高亮显示结果等功能,使其成为大数据环境下理想的搜索解决方案。 在描述中提到,这个插件是经过个人试用并且评价为简单好用的,这意味着它...

    solr 企业搜索引擎教程

    ### Apache Solr 企业搜索引擎教程知识点总结 #### 1. Apache Solr 概述 - **Solr**:Apache Solr 是一款高度可扩展且高性能的企业级搜索平台,由Apache软件基金会维护。它是一个开源搜索服务器,使用Java语言编写...

    solr开发维护参考

    6. **排序与评分**:除了基于相关性排序外,Solr还可以根据其他字段或自定义函数进行排序。同时,可以通过修改TF-IDF评分模型或者实现自定义评分函数来调整搜索结果的排名。 7. **分布式搜索**(SolrCloud):...

    solr7.5官方文档

    文档中提供了 Solr 搜索机制的总体概述,包括查询解析、评分算法等关键技术点。 #### Velocity 搜索 UI Velocity 搜索 UI 是 Solr 提供的一种可视化搜索界面,便于用户进行交互式搜索。 #### 相关性 文档中介绍...

    solr全文检索中需要用到的apache-solr-1.4.1.zip

    - **查询与排序**:Solr支持丰富的查询语法,包括布尔操作、短语匹配、模糊匹配等,并可进行多维度排序。 2. **主要特点**: - **分布式搜索**:Solr能够分布式部署,支持数据的水平扩展,提供高可用性和负载均衡...

    solr-8.0.0.tgz

    6. **配置灵活性**:Solr的配置文件允许用户根据需求定制索引和查询行为,例如设置评分算法、过滤器和排序规则。 7. **结果集排序和剪枝**:Solr允许用户根据相关度或其他自定义因素对搜索结果进行排序,并且可以...

    solr各种最近的jar包

    查询解析器负责将用户的输入转化为Solr可以理解的查询语言,而排序机制则允许用户根据特定字段或评分对搜索结果进行排序。 2. **Solr服务器**:Solr服务器是运行Solr应用的载体,通常使用Jetty或Tomcat等Web服务器...

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    Solr能够对大量数据进行快速的全文检索,同时支持多字段排序、分面搜索和自定义评分策略。为了保持索引与源数据的一致性,Solr引入了DIH,这是一个内建的机制,用于从关系数据库、XML文件等外部数据源导入数据,并将...

    solr深入浅出

    多核配置是Solr实现多租户或不同业务场景搜索的关键,每个core可以看作独立的搜索引擎实例。 Solr的应用广泛,涵盖了从基础的全文搜索到复杂的业务逻辑集成。在应用过程中,需要根据业务模型设计合适的Schema,通过...

    solr4.6.0 源代码

    Solr的核心是Lucene库,这是一个强大的全文搜索引擎库,但Solr在Lucene的基础上提供了更多高级特性,如分布式搜索、集群支持、多核心管理、自定义排序和高亮显示等。 源代码分析: 1. **索引构建与查询处理**: ...

    SOLR搭建企业搜索平台

    分布式搜索是Solr的一大亮点,它支持水平扩展,可以通过添加更多节点来处理更大规模的数据。在`solrconfig.xml`中配置Cloud模式,然后使用ZooKeeper进行集群协调,就可以实现SolrCloud。在SolrCloud中,索引会被分割...

Global site tag (gtag.js) - Google Analytics