Solr搜索结果高级设置
一.选择响应格式
XML是Solr的默认响应格式。从Solr的角度看,什么样的响应格式并不重要。Solr可以返回XML、JSON、Ruby、Python、PHP、二进制Java等,甚至是自定义格式。使用wt参数修改响应格式。Solr的wt参数的可用格式如下:

当需要更改Solr的响应格式时,需要在请求中将wt参数设置为你需要的类型。例如:

使用wt请求参数可以轻松地配置Solr的响应格式。如有需要,还可以为搜索应用编写专门的响应格式。为此,需要编写一个继承Solr的QueryResponseWriter的类。然后,在solrconfig.xml文件中注册该响应读写器。如下:

一般情况下没有必要专门开发一种响应格式,除非有特殊要求,例如需要对数据进行加密,或者需要对Solr返回的字段进行特别限制。
二.选择返回字段
1.返回存储字段
字段列表fl参数决定从Solr返回那些字段。字段列表定义了搜索结果中每个文档需要返回的字段,字段之间以逗号分隔,使用语法如下:

2.返回动态值
除了存储字段之外,文档还包含一种可以了解该文档的有用信息,即相关度得分。通过请求特殊的得分字段可以返回每个文档的相关度得分:
————> score为伪列,即相关度得分
3.文档转换
有时在最终文档写入Solr响应结果之前,获取文档的一些额外信息也是有帮助的。这些额外信息可能包含相关度得分如何计算的可读解释、分布式搜索中文档所在的分片,甚至是Lucene内部的文档编号。Solr使用文档转换器来返回此类信息。使用方法如下:

该请求调用了两个特殊字段:[explain]和[shard]。这些用方括号括起来的字段调用文档转换器会获得每个文档的一些元数据。Solr内置的常用文档转换器如下:

[docid]字段通常只用于需要与Lucene基础索引层面进行交互的情况中,这对大多数Solr用户来说是不常用的。
[shard]字段主要用于在分布式搜索中查找文档所在的Solr服务器和内核。
[explain]字段有助于理解文档相关度得分的计算原理。
[value]字段用于返回文档的静态值。
除了Solr内置的文档转换器,还可以通过继承org.apache.solr.response.transform.DocTransformer类,以插件方式编写自己的文档转换器,从而对整个文档进行操作与变换。要在Solr中使用自定义的文档转换器,需要创建一个工厂类来包装文档转换器,该工厂类继承自org.apache.solr.response.transform.TransformerFactory,使用时需要在solrconfig.xml中注册这个转换工厂类:

虽然文档转换器不是Solr最常用的功能,但它在搜索结果的文档返回之前,为文档操作提供了有用的扩展点。
4.返回字段的别名
除了通过动态生成值返回伪字段之外,在搜索结果的文档返回之前,Solr还提供了一种字段重命名方法。字段别名在实际字段名之前出现,使用冒号分隔,在搜索结果中使用一个新的字段来返回实际字段名【或动态生成值】的值,别名则作为新字段的名称,例如:

如果想要使用a_b_c【该文本字段既索引又存储】这样的动态字段来返回一个用户友好的字段名fleldname,字段别名方法在这里就能发挥作用。只需在字段列表中指定fieldname:a_b_c就可以了。另外,可以对任何字段以任何名称重命名【特殊名称除外】。
三.搜索结果分页
一个查询可能会匹配出大量文档,但是搜索结果通常以一页一页的方式显示给用户,每页包含一定数量的搜索结果。虽然Solr能够以毫秒级别对数百万或者数十亿文档进行高效地查询匹配,但它并没有对返回大量文档的处理方面进行优化。Solr返回数十个或数百个文档不在话下,但从千数量级开始,请求速度和吞吐速度会大幅降低。Solr的最佳实践是,首先只返回最相关的一页结果,然后允许用户继续获取后面的结果页面。这样做的话,Solr的每个请求都只返回有限数量的文档,避免了某个查询请求为了一次获取太多数据,占用资源并影响其他查询的执行速度的情况出现。
Solr的搜索结果分页需要使用两个请求参数:start和rows。start表示开始位置,从0开始。rows参数表示返回的文档数。例如:

四.搜索结果排序
搜索得到的结果按一定的次序返回。默认按关键词相关度得分进行排序,除此之外,日期、词项、数字以及函数等都可以作为排序依据。
1.按字段排序
执行关键词搜索,搜索结果默认按照文档的相关度得分以降序方式进行排序。对于相同得分的文档,根据搜索索引的Lucene内部文档编号以升序方式进行排序。如果没有相关度得分,则按Lucene内部文档编号进行排序。通过sort参数可以轻松地在搜索请求中修改默认排序。例如:

字段排序的语法是由字段和排序方向组成的列表,字段与排序方向之间使用空格分隔,各组字段排序之间使用逗号分隔。排序字段必须在schema.xml中标记为indexed=true,排序方向分asc和desc两种。
注意,字段不同语言的排序也不尽相同,Solr内置了针对特定语言排序的分词过滤器。如果字段使用这些分词过滤器,搜索结果的排序可能符合该语言规则,但与标准字符串字段的排序有所不同。
需要注意一点,由于排序使用了索引词项,如果修改了索引词项,而非字段的原始值,那么排序结果可能对用户而言没有意义。如果在Solr中进行词项替换,那么 最终的索引值【而非发送到Solr的原始值】将是排序的键。
对缺失值排序
还有一种特殊情况是,文档排序中sort字段缺少取值。由于Solr默认情况下不要求大多数字段都必备,因此很容易出现一个字段只有部分文档具备,在这种情况下,如果要对该字段进行排序,与查询相匹配但不包含该排序字段的文档应该出现在搜索结果列表中的前面还是后面?这个视情况而定,Solr提供了sortMissingLast和sortMissingFirst两个属性,用来选择合适的字段排序行为,这两个属性在schmea.xml中的定义如下:

solr 4.x及以前版本,设置麻烦且容易冲突
sortMissingLast属性设置为true,则不管排序方向如何,不包含该字段值的所有文档都会显示在搜索结果排序列表的末尾。sortMissingFirst与此类似。默认都为false。在默认设置下,缺少的文档会以升序显示在任何一种排序方式的开头,或以降序方式显示在任何一种排序方式的末尾。

solr 5.x及以后版本,默认为末尾。
排序的内存占用
排序是一个非常占用内存的过程。为了对文档进行排序,Solr使用Lucene的字段缓存,在首次请求排序时将字段的所有唯一值加载到内存中,可能也存在其他原因导致缓存已经被加载。这意味着,要对包含数百万个唯一词项的索引进行排序,每个排序字段都会消耗大量内存。首次请求字段排序时需要构建内存结构,这可能导致初始排序查询变慢。这里不是说不应该对文档进行排序,而是意识到,排序需要有足够的内存来执行排序。此外,可能需要预热Solr实例来实现缓存加载。
2.按函数排序
除了按字段排序,还可以根据函数查询的计算值进行排序。举例来说,根据距离某一点的地理位置【使用geodist函数】或文档的流行度与新旧程度【对流行度和日期字段使用数学函数】进行排序。甚至还可以将字段与函数排序结合起来,产生非常复杂的排序效果。
3.模糊排序
排序通常被认为是一个全有或全无的操作。事实上,通过Solr的相关度计算可以实现所谓的模糊排序。如果将相关度计算视为多因素的综合体,那么通过对其进行提升,可以区分出查询中每个因素的权重。
将一个查询元素的重要性相较于另一个查询元素提升数千倍,这是提升相关度得分的一种直接手段。这样做的话,首先会匹配第一个查询元素的文档,其次才会匹配第二个查询元素。如果将相关度得分之间的差异控制在一个范围内,则可以进行模糊排序。相关度得分的两部分通常一个高于另一个,有时候也会存在一些重合,导致得分较低的文档的相关度高于得分较低的文档。
模糊排序在大多数情况下更多的是一种相关度考虑,它有很多处理方法。在许多情况下,应该根据相关度进行排序,构造相应的查询,对返回文档以期望的次序进行排序,而不是使用字段硬排序技术。虽然有时两者都可以排序,但应该视搜索应用需求而定。
五.调试查询结果
如果你对搜索结果感到困惑。例如,查询解析问题导致产生多种搜索结果、相关度得分有时不显示、查询执行时间变长等。所幸,搜索处理器附带的特殊搜索组件DebugComponent可以帮助解决以上问题。
在Solr请求期间,要了解查询背后发生了什么,最简单的方法是开启调试选项,在请求中传入debug=true参数,激活DebugComponent,返回信息如下:

此外,在调试参数中还可以进一步指定返回的具体内容。与指定debug=true不同,如果指定debug=query,则只返回与查询解析器有关的部分调试信息。如果指定debug=results,则只返回相关度得分计算的解释内容。如果指定debug=timing,则只返回每个SearchComponent处理所花费的时间,这对调试执行较慢的请求很有帮助。
Solr搜索结果高级设置的更多相关文章
- Solr搜索技术
Solr搜索技术 今日大纲 回顾上一天的内容: 倒排索引 lucene和solr的关系 lucene api的使用 CRUD 文档.字段.目录对象(类).索引写入器类.索引写入器配置类.IK分词器 查 ...
- 一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(四) --高级设置二
原文:一个完整的Installshield安装程序实例-艾泽拉斯之海洋女神出品(四) --高级设置二 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(三) --高级设置一4. 根据用户选择的组 ...
- 什么是Solr搜索
什么是Solr搜索 一.Solr综述 什么是Solr搜索 我们经常会用到搜索功能,所以也比较熟悉,这里就简单的介绍一下搜索的原理. 当然只是介绍solr的原理,并不是搜索引擎的原理,那会更复杂. ...
- 理解Solr缓存及如何设置缓存大小
文献地址:http://wangdg.com/understanding-and-tuning-solr-cache/ 理解Solr缓存及如何设置缓存大小 为了得到最好的检索性能,Solr会在内存中缓 ...
- Solr系列五:solr搜索详解(solr搜索流程介绍、查询语法及解析器详解)
一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query ...
- PocketBeagle 初高级设置
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正.本文使用markdown标记语言写成,为获得最好的阅读体验,请访问我的博客原文. 1. PocketBeagle Summary ...
- spring data solr 搜索关键字高亮显示
spring data solr 搜索关键字高亮显示 public Map<String, Object> highSearch(Map searchMap) { Map map = ne ...
- 关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造)
关于Solr搜索标点与符号的中文分词你必须知道的(mmseg源码改造) 摘要:在中文搜索中的标点.符号往往也是有语义的,比如我们要搜索“C++”或是“C#”,我们不希望搜索出来的全是“C”吧?那样对程 ...
- Navicat(连接) -1高级设置
高级设置 设置位置当创建一个新的连接,Navicat 将在设置位置创建一个子文件夹.大多数文件都保存在该子文件夹: Navicat 对象 服务器类型 扩展名 查询 全部 .sql 导出查询结果设置文件 ...
随机推荐
- ADO.NET 的使用(二)
一.本篇主要讲ADO.NET的核心DataSet DataSet里面有个DataTable,DataTable还有个对应的DataView 首先呢,假设数据库的数据 id name mob 100 张 ...
- 三层架构——ATM + 购物车
三层架构:用户视图层.逻辑接口层.数据处理层. 一个功能,分成三层架构写,增加程序的可扩展性. 三层是互有联系的,从用户视图层开始写,涉及到那一层就到下一层去写,然后return 返回值,再写回来. ...
- python运算符&条件语句
运算符 算术运算符:+ ,- , *, /, %, **,// 赋值运算符:= ,+=,-=, *=,/=,%=, **= 比较运算符:==,!=, >, <, >=,<= 成 ...
- 本地缓存Ehcache
1,什么是Ehcache Ehcache是纯java的开源缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.它主要面向通用缓存.Java EE和轻量级容器, ...
- 线程 -- ThreadLocal
1,ThreadLocal 不是“本地线程”的意思,而是Thread 的局部变量.每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本 2, ...
- Python python 五种数据类型--字典
# 定义一个字典 var1 = {'a':20,'b':40}; var2 = dict(); print(type(var1)) print(type(var2)) # 长度 length = le ...
- 深入理解Java AIO(一)—— Java AIO的简单使用
深入理解Java AIO(一)—— Java AIO的简单使用 深入理解AIO系列分为三个部分 第一部分也就是本节的Java AIO的简单使用 第二部分是AIO源码解析(只解析关键部分)(待更新) 第 ...
- Java 判断 循环
一.优先级 1.1 先判断5>3,true 6>4 true;然后true==true ,最后是true; 1.2 6>5,true;而true和4无法比较.所以该判断出错: 1.3 ...
- Django-on_delete
一.外键的删除 关于on_delete的总结 1.常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 &quo ...
- NKOJ4270 小奇挖矿2
问题描述 [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿石交易市场,以便为飞船升级无限非概率引擎. [问题描述] 现在有m+1个星球,从左到右标号为0到m,小 ...