Solr搜索解析及查询解析器用法概述

时间:2024-01-26 11:08:00

一.简介

  大多数查询都使用 了标准的Solr语法。这种语法是Solr最常见的,由默认查询解析器负责处理。Solr的默认查询解析器是Lucene查询解析器【LuceneQParserPlugin类实现】。Lucene查询解析器全面支持Lucene语法及Solr的一些专用扩展。

二.Lucene查询解析器语法

  1.字段搜索

    在Solr索引中搜索一个值时,一般来说是在特定字段上进行查找。字段搜索语法是:字段名称+‘:’+搜索内容,举例如下:

    

    title:solr 或 title:"apache solr" request_content_split:(流程 问题) 备注:括号表示集合,用空格隔开每个元素,默认表示OR的含义

    尽管关键词搜索不明确指定字段的做法很常见,大需要注意的是,一般在定义的默认字段上进行关键词搜索。举例来说,如果content定义为默认字段【df=content】,则以下两个查询是等价的:

    solr 或 content:solr

    还需要注意的是,字段和冒号后面的表达式范围必须明确定义。以下两个查询是等价的【假设df=content】,不过在第一个查询中用户可能存在其他意图。

    title:apache solr 或 title:apache content:solr

    如果在同一个字段中搜索多个词项,使用组合表达式,在字段搜索中指定词项的范围:

    title:(apache solr)

    如果尝试短语搜索,使用引号【而不是括号】来定义短语范围,尽管这样会导致查询要求短语的所有词项必须同时出现。

    title:"apache solr"

  2.必备词项【使用较少】

    为指定一个或多个词项必须出现,使用一元运算符+来连接词项。除非文档包含指定的词项,否则不予匹配。如果匹配的文档必须包含多个词项,使用二元运算符AND或&&,否则对每个词项都使用一元运算符+。

    

 

    如果默认运算符是AND,在没有指定其他运算符的情况下,每个词项都要求必备。由于每增加一个必备词项都会进一步限制文档集中的结果总数,因此通过使用多个必备词项可以加快查询速度,从而进一步优化结果数量。

  3.可选词项

    相比限制必备字段的做法,扩大匹配的文档数量则适用于另外一些情况。默认运算符是OR,除非有其他指定,否则每个表达式都是可选的。同样地,多个表达式之间使用二元运算符OR或||,这表示匹配的文档中至少包含其中一个词项。

    

    值得注意的是,可选词项越多会导致匹配文档集越大,OR运算比其它布尔运算的执行成本更高。对于关键词搜索,如果内容数量有限,而且希望以牺牲查准率为代价,确保能够返回一些结果【更高的查全率】,那么会考虑使用OR作为默认运算符。由于多个可选词项的文档匹配通常会导致较高的相关度得分,使用OR作为默认运算符并根据相关度得分排名的话,仍然有可能获得搜索结果中最相关的那部分结果。不过,与要求匹配所有关键词不同的是,扩展查询会得到更多一些奇怪的匹配结果。

  4.短语搜索【使用较少,且必须使用在使用了分词器的字段上】

    如果想要匹配彼此相邻的多个词项,使用引号把它们括起来视为一个短语。此查询表达式不能保证匹配出完全一样的文本,被搜索字段可能包含对短语中词项进行修改的分析器。最合理的特定短语搜索不应该匹配无关的短语。短语搜索适用于内容中特定字段和多词名称的处理。

  5.组合表达式【常用】

    为处理任意复杂的布尔子句,Solr使用括号将查询表达式组合在一起。

    

    组合表达式可以设置表达式的上下文,例如,指明在同一个字段中搜索多个单词。组合表达式可以任意嵌套。

  6.词项邻近度

    短语搜索是词项相似度搜索的简化版本。通过添加波浪线和词项位置距离数搜索位置相近的词项,不一定是相邻的。

    

    短语搜索是词项位置距离为0的邻近搜索。

    

    词项距离为3表示查询两词之间词项距离<=3的搜索,两词项交换位置相当于移动了两个词项位置。

    指定足够大的有效邻近值,可以匹配出文档中任意位置的词项,这与AND查询效果类似。词项邻近度查询还有一个副作用,在文档中词项越靠近,该邻接查询对应的相关度得分就越高。与组合查询相比,当词项距离较大时,使用邻近词搜索花费成本更高。

  7.字符邻近

    不仅可以在词项之间进行邻近搜索,还可以对词项中的字符进行基于编辑距离的搜索,找到拼写相似的词项。字符邻近搜索的语法与词项邻近搜索类似,由于字符邻近搜索处理的是一个词项,因此不带引号。

    

    1表示与搜索词项最多有一个字符的差距,包括多一个字符,少一个字符和一个字符不一样三种情况。

  8.排除词项

    有时我们需要从查询中明确排除特定词项。在表达式上使用一元运算符-【减号】或在表达式之间使用NOT布尔运算符来排除词项。

    

    或

    

  9.区间搜索【方括号为闭区间,花括号为开区间】

    有时候我们不希望查询表达式只匹配出一个值,而是匹配出值的整个区间。区间可以是数值区间、日期区间或字符串区间。区间搜索能够找到指定的一组值,其语法为字段名加冒号再加一个方括号。

    

    如果没有指定区间的最大值和最小值,则需要对开区间的上限和下线使用通配符*

    

  10.通配符搜索

    有些情况下用户需要对Solr索引中单词或短语的变体进行匹配。对于用户输入的大多数关键词而言,词干提取这类技术让通配符搜索变得没那么重要了,然而对于查找以特定字符集开头的文档或替代单个字符的操作,通配符搜索还是还有用武之地的。

    

  11.权重表达式

    如果表达式后面指定了一个插入号【^】,无论是词项、短语还是组合表达式,都可以调整相关度权重。

    

 

  12.特殊字符转义【分词器字段除外】

    Solr中有些字符是保留字符,也就是说,它们被当做查询语法进行解析,而不是作为搜索词项。包括:

    

 

    如果要搜索保留字符,必须将保留字符用引号括起来,或者使用反斜杠对其进行转义。关键词中处理保留字符的推荐做法是在传入Solr之前去除没有搜索价值的保留字符,或者对它们依次使用反斜杠进行转义。

    

 

    当搜索字段为分词器字段时,保留字符会被分词过滤掉,因此搜索时不加保留字符也可以搜索到!