一、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数据存储最大的不同就在于排名检索:根据文档与查询的相关性进行排序,最相关的文档将处于列表最前端。
-
在文本搜索框中输入iPod,在fl字段中填入name、features、与socre三个字段,执行查询。
**结果:**返回三个文档,根据得分降序排列。
**分析:**iPod关键字在在第一个文档中出现了3次,在name字段中出现了两次,在features中出现了一次。它仅在其他文档中出现了一次。在score字段的得分数值并非具有绝对意义,它在Lucene内部仅用作相对排名,而且同一文档在不同查询中的得分并无关系。也就是说,与查询匹配的文档相关度得分仅适用于该查询。返回的搜索结果按照得分由高到低排序,文档得分越高,说明该查询越相关。 -
把查询语句修改为iPod power,执行查询。
**结果:**返回与之前查询结果相同的三个文档,并且排序也相同。
**分析:**因为这三个文档在name 或 features 字段中包含了查询词项。但是,排在前两个文档的得分更加接近,它们在第二个查询中的得分为 1.521和 1.398,在第一个查询中的得分为1.333和0.770。这是因为power字段在第二个文档中出现了两次,所以,第二个文档与iPod power的相关性高于与iPod的相关性。 -
把查询语句修改为“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 | 查询词项拼写检查 |
本文介绍了Solr的查询表单详解,包括HTTP GET请求的参数;深入讨论了Solr的搜索返回机制,强调了排名检索的重要性;详细阐述了如何进行分页和排序,以及如何利用boost值改变搜索结果的排序;最后提到了Solr的拓展搜索功能,如高级查询选项。

4364

被折叠的 条评论
为什么被折叠?



