标准查询分析器:Solr的默认查询解析器也称为“Lucene”解析器。
标准查询解析器的主要优点是,它支持一种健壮且相当直观的语法,允许您创建各种结构化查询。最大的缺点是,与设计为尽可能少地抛出错误的DisMax的查询解析器相比,它非常不容忍语法错误。
除了常见的查询参数、分面参数、高亮参数和“更多其他”参数,标准查询分析器还支持下表中描述的参数。
q 使用标准查询语法定义查询。此参数是必需的。
q.op 指定查询表达式的默认运算符,指定的默认运算符。可能的值为“AND”或“OR”。
df 指定默认字段,重写模式中默认字段的定义。
sow
在空白处拆分。如果设置为true,则对每个单独的空白分隔词分别调用文本分析。默认值为false;一次将为文本分析提供空格分隔的词条序列,从而使分析筛选器能够在词条序列上正常工作,例如多词同义词和名词复数。
默认参数值可以在solrconfig.xml中指定,也可以在查询时覆盖。
response默认情况下,来自标准查询解析器的响应包含一个未命名的
本节介绍了来自标准查询解析器的响应示例。
下面的URL提交一个简单的查询,并请求XML响应写入器使用缩进来提高XML响应的可读性。
http://localhost:8983/solr/techproducts/select?q=id:SP2514N&wt=xml
返回
下面是一个带有限字段列表的查询示例
http://localhost:8983/solr/techproducts/select?q=id:SP2514N&fl=id+name&wt=xml
返回
对标准查询解析器的查询被分解为术语和运算符。有两种术语:单个术语和短语。
单个术语是一个单词,例如“test”或“hello”。
短语是由双引号环绕的一组单词,如“hello dolly”。
可以将多个术语与布尔运算符组合在一起,以形成更复杂的查询(如下所述)。
注意:用于查询的分析器解析术语和短语的方式必须与用于索引的分析器解析术语和短语的方式一致,否则,搜索可能会产生意外的结果。
solr支持各种术语修饰符,可以根据需要增加搜索的灵活性或精度。这些修饰符包括通配符、用于使搜索“模糊”或更通用的字符等。下面的章节详细描述了这些修改器。
Solr的标准查询分析器支持在单个术语中进行单字符和多字符通配符搜索。通配符可以应用于单个词,但不能用于搜索短语。
通配符搜索类型 |
字符 |
Example |
单个字符(与单个字符匹配) |
? |
The search string te?t would match both test and text. |
多个字符(匹配零个或多个连续字符) |
* |
The wildcard search: tes* would match test, testing, and tester. You can also use wildcard characters in the middle of a term. For example: te*t would match test and text. *est would match pest and test. |
Solr的标准查询解析器支持基于Damerau-Levenshtein距离或编辑距离算法的模糊搜索。模糊搜索发现与指定术语相似的术语,而不必完全匹配。要执行模糊搜索,请在单个单词词条末尾使用~符号。例如,要搜索拼写与“roam”相似的词,请使用模糊搜索:
roam~
roams, foam, foams
可选距离参数指定允许的最大编辑次数,在0到2之间,默认为2。例如:
roam~1
roams foam it has an edit distance of "2".not foams
注意:在许多情况下,词干(将词条缩减为公共词干)可以产生类似于模糊搜索和通配符搜索的效果。
邻近搜索查找彼此之间在特定距离内的术语。
若要执行邻近搜索,请将字符~和一个数值添加到搜索短语的末尾。
例如,要在文档中搜的“apache”和“jakarta”存在10个单词内距离,请使用以下搜索:
"jakarta apache"~10
这里所指的距离是匹配指定短语所需的术语移动数。在上面的例子中,如果“apache”和“jakarta”在一个字段中相距10个空格,但“apache”出现在“jakarta”之前,则需要10个以上的术语移动来将术语一起移动,并将“apache”定位到“jakarta”的右侧,中间有一个空格。
范围搜索指定字段的值范围(具有上界和下界的范围)。查询匹配指定字段的值在范围内的文档。范围查询可以包含或不包含上界和下界。排序是按字典方式完成的,除了数字字段。例如,下面的范围查询匹配所有“流行度”字段值介于52和10000(包括52和10000)之间的文档。
popularity:[52 TO 10000]
范围查询不限于日期字段甚至数字字段。还可以将范围查询与非日期字段一起使用:
title:{Aida TO Carmen}
这将找到所有标题介于Aida 和Carmen之间的document,但不包括Aida 和Carmen。
查询周围的括号决定了它的包容性。
方括号[]表示与值(包括上界和下界)匹配的包含范围查询。
大括号{}表示一个排他范围查询,该查询匹配上界和下界之间的值,但不包括上界和下界本身。
您可以混合这些类型,这样范围的一端是包含的,另一端是不包含的。举个例子: count:{1 TO 10]
Lucene/Solr根据找到的术语提供匹配文档的相关性级别。要增强术语,请使用插入符号^并在搜索的术语末尾加上增强因子(数字)。增强因子越高,该术语的相关性就越强。
“"jakarta apache ”,你想让“jakarta”这个词更具相关性,你可以在这个词后立即添加^符号和增强因子来增强它。例如,您可以键入:
jakarta^4 apache
这将使“jakarta”这一术语的文档显得更加相关。您还可以增强短语术语,如示例中所示:
"jakarta apache"^4 "Apache Lucene"
默认情况下,增强因子为1。尽管增强因子必须为正,但它可以小于1(例如,它可以为0.2)。
常量分数查询是用
例如 (description:blue OR color:blue)^=1.0 text:shoes
SOLR中索引的数据按字段组织,这些字段在SOLR模式中定义。搜索可以利用字段为查询添加精度。例如,只能在特定字段(如标题字段)中搜索术语。
模式将一个字段定义为默认字段。如果不在查询中指定字段,SOLR只搜索默认字段。或者,可以在查询中指定其他字段或字段组合。
若要指定字段,请键入字段名,后跟冒号“:”,然后键入要在字段中搜索的术语。
例如,假设一个索引包含两个字段,即标题title和文本text,而该文本text是默认字段。如果要查找一个名为“The Right Way”的文档,其中包含文本“don’t go this way,”,则可以在搜索查询中包含以下任一术语:
title:"The Right Way" AND text:go
title:"Do it right" AND go
由于文本text是默认字段,因此不需要字段指示符;因此上面的第二个查询省略了它。
该字段仅对其直接前面的术语有效,因此查询标题:Do It Right将在标题字段中仅找到“Do”。它将在默认字段中找到“it”和“right”(在本例中是文本字段)。
布尔运算符允许您将布尔逻辑应用于查询,要求字段中存在或不存在特定的条款或条件,以便与文档匹配。下表总结了标准查询分析器支持的布尔运算符。
布尔运算 |
替代符合 |
描述 |
AND |
&& |
要求布尔运算符两侧的两个术语都存在以进行匹配。 |
NOT |
! |
要求以下术语不存在。 |
OR |
|| |
要求一个匹配项存在一个术语(或同时存在两个术语)。 |
|
+ |
要求出现以下术语。 |
|
- |
禁止使用以下术语(即不包含该术语的字段或文档上的匹配项)。-运算符的功能与布尔运算符相似!.因为它被流行的搜索引擎如谷歌使用,所以对某些用户群体来说可能更熟悉。 |
布尔运算符允许通过逻辑运算符组合术语。Lucene支持AND, “+”, OR, NOT ,“-”作为布尔运算符。
当使用关键字指定布尔运算符时,关键字必须全部大写。
标准查询分析器支持上表中列出的所有布尔运算符。DisMax查询分析器只支持+和-。
或运算符是默认的连接运算符。这意味着如果两个术语之间没有布尔运算符,则使用OR运算符。或运算符链接两个术语,如果文档中存在任何一个术语,则查找匹配的文档。这相当于使用集合的并集。
要搜索包含“jakarta apache”或“jakarta”的文档,请使用以下查询:
"jakarta apache" jakarta
or
"jakarta apache" OR jakarta
+符号(也称为“必需”运算符)要求在至少一个文档的某个字段中存在+符号之后的术语,以便查询返回匹配项。
例如,要搜索必须包含“jakarta”且可能包含或不包含“lucene”的文档,请使用以下查询:
+jakarta lucene
标准查询解析器和DisMax查询解析器都支持此运算符。
和运算符匹配两个术语都存在于单个文档文本中任何位置的文档。这相当于使用集合的交集。符号&&可代替单词AND。
要搜索包含“jakarta apache”和“apache lucene”的文档,请使用以下任一查询:
"jakarta apache" AND "Apache Lucene"
"jakarta apache" && "Apache Lucene"
NOT运算符排除包含NOT之后的术语的文档。这相当于使用集合的差异。符号!可以用来代替NOT这个词。
以下查询搜索包含短语“jakarta apache”但不包含短语“apache lucene”的文档:
"jakarta apache" NOT "Apache Lucene"
"jakarta apache" ! "Apache Lucene"
-运算符是不包括包含-符号后的术语的文档。
"jakarta apache" -"Apache Lucene"
当以下字符出现在查询中时,solr会给出其特殊含义:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : /
要使solr从字面上解释这些字符中的任何一个,而不是作为一个特殊字符,在字符前面加上反斜杠字符\。例如,要搜索(1+1):2而不使用solr将加号和圆括号解释为特殊字符,以便用两个词组成子查询,请在每个字符前面加上反斜杠来转义字符:
\(1\+1\)\:2
Lucene/Solr支持使用括号将子句分组以形成子查询。如果您想控制查询的布尔逻辑,这可能非常有用。
下面的查询搜索“jakarta”或“apache”和“website”:
(jakarta OR apache) AND website
这增加了查询的精度,要求术语“website”存在以及术语“jakarta”和“apache”存在任何一个。
要对搜索中的单个字段应用两个或多个布尔运算符,请将布尔子句分组到括号中。例如,下面的查询搜索包含单词“return”和短语“pink panther”的标题字段:
title:(+return +"pink panther")
查询中的注释
查询字符串中支持C样式的注释。
"jakarta apache" /* this is a comment in the middle of a normal query string */ OR jakarta
Solr的标准查询解析器源于Lucene的“经典”查询解析器的变体。它分为以下几种:
*可用于任一或两个端点,以指定开放式范围查询。
field:[* TO 100] 查找所有小于或等于100的字段值
field:[100 TO *] 查找所有大于或等于100的字段值
field:[* TO *] 将所有文档与字段匹配
允许-查询(禁止所有子句)(仅作为顶级子句)
-inStock:false 查找instock非false的所有字段值。
-field:[* TO *]查找没有字段值的所有文档
支持使用任何类型的查询分析器作为嵌套子句使用本地参数语法的嵌入式SOLR查询(子查询)。
inStock:true OR {!dismax qf='name manu' v='ipod'}
注意:小心不要以开始查询{!最开始,它改变了整个查询字符串的解析,如果有附加子句,这可能不是您想要的。因此,翻转上面的示例,使子查询首先出现,如果没有前导空格,将无法按预期工作。?
子查询也可以用magic字段“_query_”来完成,也可以用magic字段“_val_来完成函数查询,但由于不太清楚,因此应将其视为已弃用。例子:
_val_:"recip(rord(myfield),1,2,3)"?
支持特殊的filter(…)语法,以指示某些查询子句应缓存在筛选缓存中(作为常量分数布尔查询)。这允许子查询被缓存并在其他查询中重新使用。例如instock:true将被缓存,并在以下三个查询中重新使用:
q=features:songs OR filter(inStock:true)
q=+manu:Apple +filter(inStock:true)
q=+manu:Apple & fq=inStock:true
这甚至可以用于缓存复杂筛选查询的各个子句。在下面的第一个查询中,将向筛选器缓存添加3个项目(顶级fq和两个filter(…)子句),在第二个查询中,将有2个缓存命中,以及一个新的缓存插入(对于新的顶级fq):
q=features:songs & fq=+filter(inStock:true) +filter(price:[* TO 100])
q=manu:Apple & fq=-filter(inStock:true) -filter(price:[* TO 100])
范围查询(“[A到Z]”)、前缀查询(“A*”)和通配符查询(“A*B”)是恒定的评分(所有匹配的文档都得到相同的评分)。不使用评分因子tf、idf、指数提升和“coord”。匹配的术语数量没有限制(就像以前的Lucene版本一样)。
常量分数查询是用
q=(description:blue color:blue)^=1.0 title:blue^=5.0
对基于日期的字段的查询必须使用适当的日期格式。对确切日期值的查询将需要引用或转义。