一.字段查询解析器
字段查询解析器在指定字段中搜索词项或短语,可以使用该字段定义的任何文本分析方式。f参数指明要进行词项或短语搜索的字段,语法如下:
{!field f=myfield}hello world
该语法与使用Lucene查询解析器搜索短语myfield:"hello world"是等价的。
二.词项查询解析器和原始查询解析器
词项查询解析器可以直接在Solr索引上进行检索,但不能使用字段上定义的文本分析方法。这是它与字段查询解析器的不同之处。词项查询解析器可以对分面搜索返回的值进行过滤,或对Solr索引中直接提取的词项组件进行过滤。词项查询解析器的语法如下:
{!term f=mystemmedtextfield}engin
{!term f=mystringfield}Single Term with Spaces
{!term f=myintfield}1.5
在之前的例子中,搜索到的值是查询提问中该字段在Solr索引中词项的可读版本。与字段查询解析器一样,f参数指向的是搜索的字段。
Solr还提供了一个类似的实现形式——原始查询解析器。词项查询解析器与原始查询解析器的唯一区别是原始查询解析器在Solr索引中搜索确切的词项,而词项查询解析器搜索该词项的可读版本。
在特定字段中,例如:为了提高搜索效率,数值字段的内部存储采用了trie结构,此时词项查询解析器接受数值的可读版本,而原始查询解析器接受Solr索引中该字段内部存储的机读版本。整数字段的数值1可能表示Solr索引中诸如"#8;#0;#0;#0;#1"此类的词项trie结构。
三.函数查询解析器和函数区间查询解析器
Solr强大的一个功能是在搜索过程中使用函数查询来生成动态值。这样的动态计算值包括确定地理空间距离、执行数学计算、转换字符串或在自定义的函数插件中执行任意代码。
四.嵌套查询和嵌套查询解析器
Lucene查询解析器和eDisMax查询解析器的查询语法支持一个特殊的运算符_query_,利用它可以方便地对默认的Lucene查询解析器中其它查询解析器进行替换,这使得我们可以在任意复杂的布尔表达式中组合不同的查询解析器。执行嵌套查询的语法为_query_:"[QUERY]",其中[QUERY]表示在q或fq参数中单独使用的任意查询。例如:
/select?q=category:{"technology" OR "business"} AND _query_:"{!edismax qf=title^10 category^4 text}solr lucene hadoop mahout"
在许多情况下没有必要显式使用_query_语法,当Lucene查询解析器和eDisMax查询解析器发现查询中包含局部参数时,一般会推测出需要使用嵌套查询。越复杂的查询,在_query_语法中需要使用嵌套查询的可能性就越大,这样做是为了确保按查询意图进行解析。
除了特殊的_query_运算符之外,Solr还提供了一个内置的嵌套查询解析器,它也可以处理嵌套查询。嵌套查询解析器的局部参数类型是query,通过以下方式调用:
/select?q={!query v=$nestedQuery}
五.调整权重查询解析器
调整权重查询解析器允许根据一个文档是否与特定查询匹配,自行定义相关度的调整策略,无须过滤掉与要调整的查询不匹配的文档。通常来说,参数q用于过滤搜索结果,并获得相关度评分中涉及的表达式的相似度情况。调整权重查询解析器可以提交相关度评分中所涉及的词项,而不将其作为过滤器使用。语法如下:
{!boost b=1000}shouldboost:true
{!boost b=log(popularity)}category:trending
{!boost b=recip(ms(NOW, articledate), 3.14e-11, 1, 1)}category:news
调整权限查询解析器对那些与指定查询值匹配的文档的相关度进行调整,但不会将文档限制为仅与该查询值匹配的那些文档。此外,也可以使用嵌套查询将调整权限查询解析器与其他查询解析器结合使用。
/select?q=_query_:"{!edismax qf=title content}data science" AND _query_:"{!boost b=log(popularity)}*:*" AND _query_:"{!boost b=recip(ms(NOW, articledate), 3.14e-11, 1, 1)}category:news"
六.前缀查询解析器
前缀查询解析器可用于通配符查询,语法如下:
{!prefix f=myfield}engin
该查询等价于使用Lucene查询解析器搜索myfield:engin*,对myfield字段匹配诸如engine,enginneer或engineering这样的词项。应该注意到,前缀是直接对Solr索引进行搜索,所以在与索引对比之前,不会对输入进行文本。采用词项的索引表示是为了避免前缀输入与要搜索的词项之间出现匹配失误。在大多数情况下,更好的做法是使用Lucene查询解析器或eDisMax查询解析器进行通配符搜索。
七.空间查询解析器
Solr提供丰富的地理空间搜索功能,可以在索引和查询阶段定义位置或形状。通过给定一个具体位置可以过滤特定范围内的文档。Solr提供两个用于空间查询的查询解析器,一个是空间框查询解析器【bbox】,另一个是空间过滤查询解析器【geofit】。
八.连接查询解析器
Solr的连接查询解析器可以执行子查询,实现文档集的伪连接。例如,要对查询进行限制,可以对不同的文档集执行子查询,并将原始查询结果集的限制条件设为文档只包含子查询文档中出现的字段值。Solr的连接功能还可以用于垮Solr内核的文档集查询。
九.分支查询解析器
分支查询解析器根据一些逻辑条件在多个查询/过滤器之间做出选择。它的操作与许多编程语言的分支语句类似。具体语法如下:
fq={!switch
case.day='date:[NOW/DAY-1DAY TO *]'
case.week='price:[NOW/DAY-7DAYS TO *]'
case.month='date:[NOW/DAY-1MONTH TO *]'
case.year='date:[NOW/DAY-1YEAR TO *]'
case.else='*:*'
v=$withinLast
}
十.外围查询解析器
外围查询解析器是为跨度查询的充分使用而设计的,其用于掌握词项彼此之间的位置关系。外围查询解析器使用特殊的运算符n(有序)和w(无序)及在其前面带一个1~99之间额整数值。举例如下:
{!surround}3w(solr, action):前缀表示,能在距离词项action 3个词项位置之内【无序、向前或向后】找到词项solr
{!surround}5n(solr, action):前缀表示,能在距离词项action5个位置之内【action必须位于 solr之后】找到词项solr
{!surround} solr 3w action:中缀表示,等价第一个例子
{!surround} solr 3n in 2w action:中缀表示,其中词项solr必须在距离词项in之后的3个词项位置之内,而词项action必须在距离词项in之前或之后2个词项位置之内
外围查询解析器还支持在前缀表示中使用AND和OR运算符,在中缀表示中使用AND、OR、NOT以及()运算符。虽然增加的邻近运算符似乎是Solr可用查询语法的有力补充,但外围查询解析器存在一个主要限制:它不支持文本分析。与词项解析器类似,外围查询解析器不先执行字段类型定义的分析器,而是直接在Solr索引上检索词项。
十一.最大得分查询解析器
当使用Lucene查询解析器对查询进行评分时,每个词项和子句都会被评分,所有这些评分汇总在一起作为每个文档的总相关度得分。在某些情况下,使用最大得分比使用总得分要好一些。MaxScoreQParserPlugin的用法如下:
{!maxscore}term1 term2 term3
十二.折叠查询解析器
折叠查询解析器能够从搜索结果集中删除重复的文档【即这些文档包含指定字段中的相同值】,这称为字段折叠。在Solr中,字段折叠有两种实现方法。第一种是使用功能更丰富的结果分组,将字段中具有相同值的文档合在一起。每一组返回文档的具体数量。第二种是使用折叠查询解析器,将相同字段值的文档合在一起、