Solr——query parser
Lucene通过Query Parser来进行对Lucene index的查询,就像关系型数据库和SQL语言的关系一样。
Solr中有多种query parser的实现。Solr中默认的Query parsers是LuceneQParserPlugin
Lucene query parser
Lucene query parser语法
基本检索方式
title:apache solr #在field title中搜索apache,在df(default field)中搜索solr
title:apache content:solr # 在field title中搜索apache,在field content中搜索solr
title:(apache solr) #在field title中搜索包含apache和solr。
title:"apache solr" #搜索词组apache solr
Boolean运算符
# 以下三者相同
apache AND solr
apache && solr
+apache +solr
# 以下两者相同
apache OR solr
apache || solr
范围查询
number:[12.5 TO 100]
number:[100 TO *] # 100-~
number:{0 TO 100} # 1-99
number:[1 TO 99] # 1-99
number:{0 TO 100] # 1-100
date:[2013-11-04T10:05:00Z TO NOW-1DAY]
date:[NOW-1Year TO *]
string:[ape TO apple] # 匹配记录appetite
加权查询
apache^2 solr^1
excluding
solr –panel #包含solr,并且不包含panel的结果
solr NOT panel #包含solr,不包含panel
–badterm # 不包含badterm
相似度查询
单词的相似度
solr~1 # 匹配sol, sor, slr, salr, olr
句子的相似度:词相同,但是顺序不同
"apache software foundation"~2 # 匹配"apache foundation software", "software apache foundation", "apache [otherWord][otherWord2]software foundation"
通配符方式
*匹配一个或多个字符串:he*o匹配hello
?匹配一个字符串:hel?o匹配hello
Lucene query parser的保留字
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
如果在Lucene query中包含这些保留字程序将会返回错误,因此如果需要使用以上的保留字,需要先进行转义操作。
eDismax query parser
eDisMax query parser实际上是Lucene query parser和DisMax(Disjunction Max)的功能的集合。也就是说Lucene query parser中的语法在eDismax中也可以使用。
DisMax query parser只支持基本的boolean操作,但是支持跨多个field的查询功能。
why eDismax query parser?
eDismax query parser与Lucene query parser比较有两个优势
- 可以进行对多个field的查询
- 特殊字符(如:+ - &&等)不必进行转义操作
如果实现对多个field的查询,如title,description,author等
Lucene query parser的写法是
(((title:solr) OR (description:solr) OR (author:solr)) AND ((title:in) OR
(description:in) OR (author:in)) AND ((title:action) OR (description:action)
OR (author:action)))
eDismax query parser的写法是:
q=solr in action&qf=title description author # 通过qf(query field)参数实现跨field的查询
如何使用eDismax query parser?
通过在查询语句中加入defType参数改变默认的query parser:
/select?defType=edismax&q=...
也可以在q参数中混合使用query parser
/select?q={!edismax}hello world
/select?q={!term}hello
/select?q={!edismax}hello world OR {!lucene}title:"my title"