在Rails使用Sunspot习惯了,可能对Solr的原生查询完全不了解,其实Sunspot对Solr的查询进行了非常完美的封装,Sunspot的查询会转换为这样的请求(参见solr.log):
INFO - 2016-01-30 20:19:20.893; org.apache.solr.core.SolrCore; [collection1] webapp=/solr path=/select params={fl=*+score&sort=updated_at_d+desc&start=0&q=安徽&qf=title_text+content_text&wt=ruby&fq=type:Bid\:\:Info&fq=close_tag_i:0&rows=20&defType=edismax} hits=1 status=0 QTime=20
而
{fl=*+score&sort=updated_at_d+desc&start=0&q=安徽&qf=title_text+content_text&wt=ruby&fq=type:Bid\:\:Info&fq=close_tag_i:0&rows=20&defType=edismax}
这个才是Solr服务器真正能够理解的查询参数,当我们遇到使用Sunspot无法解决的问题的时候,就需要直接越过Sunspot来调用Solr了。Solr接受的是HTTP协议的接口调用,因此查询的参数都是通过URL参数来进行传递,而且参数中的值都需要进行URL的编码。
下面来详细介绍Solr的查询语法。
Solr默认有三种查询解析器(Query Parser):
- Standard Query Parser
- DisMax Query Parser
- Extended DisMax Query Parser (eDisMax)
第一种是标准的Parser,最后一种是最强大的,也是Sunspot默认使用的Parser。
支持的参数:
- defType: 选择查询解析器类型,例如dismax, edismax
- q:主查询参数(field_name:value)
- sort:排序,例如score desc,price asc
- start:起始的数据偏移offset,用于分页
- raws:一次返回的数量,用于分页
- fq:filter query 返回结果的过滤查询
- fl:fields to list 返回的字段(*, score)
- debug:返回调试信息,debug=timing,debug=results
- timeAllowed:超时时间
- wt:response writer返回的响应格式
下面是DisMax Parser可以使用的:
- qf:query fields,指定查询的字段,指定solr从哪些field中搜索,没有值的时候使用df
- mm:最小匹配比例
- pf:phrase fields
- ps:phrase slop
- qs:query phrase slop
特殊符号意义:
- ?:te?t 单个字符匹配
- *:tes* 多个字符匹配
- ~:fuzzy searches(模糊匹配),roam~,roams/foam/foams
- count:{1 TO 10}:range search 范围检索
- ^:Boosting a Term(升级权重),jakarta^4 apache, "酒店"^4 "宾馆"
- ^=:Constant Score with(指定分数),(description:blue OR color:blue)^=1.0 text:shoes
逻辑操作
- AND 或者 &&
- NOT 或者 !
- OR 或者 !!
- + 必须满足
- - 剔除,比如 title: -安徽,返回的是title中不含有"安徽"的所有结果
回顾复习
fl=*+score
sort=updated_at_d+desc
start=0
q=安徽
qf=title_text+content_text
wt=ruby
fq=type:Bid\:\:Info
fq=close_tag_i:0
rows=20
defType=edismax
夏书记的需求:
q=(酒店 OR type_i:0)
Solr的查询可以在图形界面中进行测试: