Solr查询处理简介

一、Solr的查询表单详解

Solr管理控制台的查询表单

所有与solr核心服务有关的交互,如查询处理,都是通过HTTP请求执行的。填写查询表单之后,创建一个HTTP Get请求并发送给Solr。

Solr查询表单的所有参数

查询参数概览表:

参数

取值

描述

defType

/select

选择用来处理查询的查询分析器。

q(query)

iPod

主查询参数。根据该参数中的词项与文档的相似度,对文档评分

fq(filter query)

manu:Belkin

过滤查询;通过过滤器筛选结果集文档,但不影响评分。在此例中,我们将制造商字段manu限定在Belkin,对结果进行筛选

sort

price asc

指定排序字段与排序方式。根据响应的分数或另一个指定的特性对查询的响应进行正序或倒序排序。 在此例中我们希望按照价格从低到高升序排列文档。

start

0

指定搜索结果的起始页。(默认0)。

rows

10

页面大小。控制一次返回多少条数据(默认10)

fl(field)

name,price,features,score

在结果集中每个文档返回的字段列表。score字段是内置字段,用于保存每个文档的查询相关度得分。必须显式地请求score字段,它才会返回。

df(default)

text

未指定搜索字段的任意查询词项的默认搜索字段;text是示例服务器的全包含(catch-all)字段

wt(writer)

xml

响应输出类型,控制响应输出的格式。

查询表单的http get请求分解:

http://127.0.0.1:8983/solr/collection1/select?q=iPod&
fq=manu%3ABelkin&
sort=price+asc&
start=0&
rows=10&
fl=name%2Cprice%2Cfeatures%2Cscore&
df=text&
wt=xml&
indent=true

注意:HTTP GET请求的参数间不包括换行,这里的换行只是为了更加容易理解。

查询表单不是为最终用户设计的,而是solr为开发者和管理员提供的一个查询提交途径。使用solr应用程序,需要为用户开发搜索界面。

二、Solr的搜索返回机制

前面介绍了Solr的查询请求提交,现在了解一下solr的搜索返回机制。本小节的核心是Solr返回的查询匹配的文档集,还包括为达到优质搜索体验solr客户端需要处理的其他信息。搜索体验优化由solr客户端负责。solr返回原始的搜索结果数据,并提供核心的搜索功能,要为用户提供优质的搜索体验,则需要根据这些结果和功能进行自主设计与开发。 以下为示例结果查询所返回的搜索结果。搜索结果是XML格式,按照价格从低到高排序。每一个文档均包含iPod关键字。因为只有两个搜索结果,所以没有分页。

<?xml version="1.0" encoding="UTF-8"?>
<response>

<!-- 响应的头部元素包含该查询的状态信息,例如,执行时间(Qtime)以及返回相应的查询参数。 -->
<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">1</int>
  <lst name="params">
    <str name="q">iPod</str>
    <str name="df">text</str>
    <str name="indent">true</str>
    <str name="fl">name,price,features,score</str>
    <str name="start">0</str>
    <str name="fq">manu:Belkin</str>
    <str name="sort">price asc</str>
    <str name="rows">10</str>
    <str name="wt">xml</str>
    <str name="_">1527330711756</str>
  </lst>
</lst>

<!-- 主响应元素包括找到的文档总数(numFound)以及最佳文档的相关度得分(score),即最大得分(maxScore)。-->
<result name="response" numFound="2" start="0" maxScore="1.3334373">
<!-- 与查询因素匹配的文档,即“命中文档”,每个文档的显示字段由fl参数控制。 -->
  <doc>
    <str name="name">iPod & iPod Mini USB 2.0 Cable</str>
    <arr name="features">
      <str>car power adapter for iPod, white</str>
    </arr>
    <float name="price">11.5</float>
    <float name="score">1.3334373</float></doc>
  <doc>
    <str name="name">Belkin Mobile Power Cord for iPod w/ Dock</str>
    <arr name="features">
      <str>car power adapter, white</str>
    </arr>
    <float name="price">19.95</float>
    <float name="score">0.7698604</float></doc>
</result>
</response>

solr支持许多中格式的返回结果,如 json、csv,以及针对主流语言的特定格式。

三、排名检索

Solr的查询处理与关系型数据库或其他NoSQL数据存储最大的不同就在于排名检索:根据文档与查询的相关性进行排序,最相关的文档将处于列表最前端。

  1. 在文本搜索框中输入iPod,在fl字段中填入name、features、与socre三个字段,执行查询。 结果:返回三个文档,根据得分降序排列。 **分析:**iPod关键字在在第一个文档中出现了3次,在name字段中出现了两次,在features中出现了一次。它仅在其他文档中出现了一次。在score字段的得分数值并非具有绝对意义,它在Lucene内部仅用作相对排名,而且同一文档在不同查询中的得分并无关系。也就是说,与查询匹配的文档相关度得分仅适用于该查询。返回的搜索结果按照得分由高到低排序,文档得分越高,说明该查询越相关。
  2. 把查询语句修改为iPod power,执行查询。 结果:返回与之前查询结果相同的三个文档,并且排序也相同。 分析:因为这三个文档在name 或 features 字段中包含了查询词项。但是,排在前两个文档的得分更加接近,它们在第二个查询中的得分为 1.521和 1.398,在第一个查询中的得分为1.333和0.770。这是因为power字段在第二个文档中出现了两次,所以,第二个文档与iPod power的相关性高于与iPod的相关性。
  3. 把查询语句修改为“iPod power^2”,这里给power 赋予boost 值2,这里给power赋予boost值2,而iPod的boost值扔为1,执行查询。 结果:返回3个文档,但是排序发生了变化。因为在这个查询语句中power的重要性是iPod的两倍,而文档Belkin Mobile Power Cord for iPod w/ Dock中name和features两个字段包含了power,所以它成为了第一条搜索结果。 分析:在以上的查询中power的重要性是iPod的两倍,所以排序发生了变化。

四、分页和排序

分页

使用分页可以返回搜索结果的小部分子集,同时使用导航工具来请求更多页面。 Slor中默认的页面大小为10,可以在查询请求中通过行参数来调整页面大小。要在搜索结果中请求下一页,只需在页面大小中增量调整start参数。

排序

搜索的结果默认根据相关度得分将文档按降序(从高到低)排列。Solr还可以根据文档中的其他字段来进行排序。 排序和分页结合起来使用是因为排序决定了搜索结果在页面中的位置。如果文档的得分情况相同,那么Solr会以索引的次序来对文档进行排序。该次序基于Lucene的内部文档ID。这个文档ID大致等于被索引文档的次序。但是,由于索引变化时ID值会随之变化,所以不应依赖此ID进行排序。

五、拓展的搜索功能

查询表单包含复选框列表,可以在查询处理中实现高级功能。如下表所示:

参数

描述

dismax

析取最大查询解析器

edismax

扩展的析取最大解析器

hl

搜索结果高亮

facet

分面

spatial

地理空间搜索,如:基于位置距离的排序

spellcheck

查询词项拼写检查

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人人都是极客

环形缓冲区的实现

队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。

47440
来自专栏linux驱动个人学习

高通 display 驱动【转】

2.3K40
来自专栏前端侠2.0

oracle 两表关联时,年月条件的写法引起的巨大性能的差异

需求是要比较最近两个月的值,进行数据检验!所以我用自关联,来将两个月的数据放到一行上,然后进行比较!

17020
来自专栏机器学习从入门到成神

Pandas使用DataFrame进行数据分析比赛进阶之路(二):日期数据处理:按日期筛选、显示及统计数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

1.2K10
来自专栏有趣的django

Django+Bootstrap+Mysql 搭建个人博客(一)

1.8K00
来自专栏圣杰的专栏

CASE WHEN 高阶用法?

两个表做关联时,以左表为准,若左表某列不为空,则与右表对应列进行关联匹配,为空则不做匹配。 ? 以上做法,有一种说不出来的感觉,不管怎样,问题是解决了。 如...

365130
来自专栏算法+

不用第三方解码库取得图片宽高 附完整C++算法实现代码

在特定的应用场景下,有时候我们只是想获取图片的宽高, 但不想通过解码图片才取得这个信息。 预先知道图片的宽高信息,进而提速图片加载,预处理等相关操作以提升体验。...

45460
来自专栏叔叔的博客

遇到的java随机数引起的阻塞问题

最后通过使用jstack -[pid],发现 sun.security.provider.SecureRandom 这里锁住了,原来这是java产生随机数造成了...

11040
来自专栏技术碎碎念

处理机进程调度模拟

一、进程调度 无论是在批处理还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按...

458110
来自专栏积累沉淀

大型数据库技术1

什么是数据库? 在计算机系统中按照一定的数据模型组织、存储和使用相互关联的数据集合。 数据模型 通常是由数据结构、数据操作、完整性约束3部分组成。    ...

22260

扫码关注云+社区

领取腾讯云代金券