译自:https://lucene.apache.org/core/2_9_4/queryparsersyntax.html
Apache Lucene查询解析语法
术语
查询被分解成术语和操作符。有两种术语:单一术语和短语。
一个单词是一个单词,例如“test”或“hello”。
短语是一组被双引号包围的词,如“hello dolly”。
可以将多个术语与布尔运算符组合在一起,形成更复杂的查询(见下面)。
字段
Lucene支持现场数据。可以指定字段,也可以使用默认字段。字段名和默认字段是具体实现的。
您可以通过输入字段名和冒号“:”和您正在查找的术语来搜索任何字段。
作为一个例子,让我们假设一个Lucene索引包含两个字段,title和text并且text是默认字段。如果你想找到一份名为“The Right Way”的文件,其中包含了“don't go this way”的文字,你可以进入:
title:"The Right Way" AND text:go
由于text是默认字段,也可以写成title:"The Right Way" AND go
注意:该字段仅对其直接前面的术语有效,因此查询
title:The Right Way
只会在标题栏中找到“The”。它将在默认字段中找到“Right”和“Way”(在本例中为文本字段)。
词修饰符
Lucene支持修改查询条件以提供广泛的搜索选项。
通配符搜索
Lucene支持单个和多个字符的通配符搜索(不是在短语查询中)。
要执行单个字符的通配符搜索,使用“?”符号。
要执行一个多字符的通配符搜索使用“*”符号。
单个字符通配符搜索查找与单个字符替换的匹配项。例如,要搜索“text”或“test”,您可以使用搜索:
te?t
多个字符通配符搜索查找0或更多字符。例如,为了搜索test, tests or tester,您可以使用搜索:
test*
可以在一个术语的中间使用通配符搜索。
te*t
注意:您不能使用*或者?符号作为搜索的第一个字符。
模糊搜索
Lucene支持基于Levenshtein距离的模糊搜索,或者编辑距离算法。要进行模糊搜索,可以使用波浪号,“~”,在一个词的结束时的符号。例如,搜索一个类似于拼写“roam”的词,使用模糊搜索:
roam~
可以查询类似roam和roams
从Lucene 1.9开始,一个附加的(可选的)参数可以指定所需的相似性。值在0到1之间,(如果没有给出参数,将使用默认值为0.5。)值更接近1,只有具有更高相似性的条件才会匹配。例如:
roam~0.8
临近搜索
Lucene支持在特定的距离内找到单词。要做近距离搜索,使用“~”,一个短语的末尾的符号。例如=>想要搜索包含"hello""world"的文档,这两个单词中间可以有一部分内容(这部分内容通过字符个数限制)
"hello world"~10
可以匹配"hello 123 world"
或者"hello,Tom,world"
范围搜索
范围查询允许一个匹配域(s)值位于范围查询指定的下界和上界之间的文档。范围查询可以是包容的,也可以是上下限的。排序是按照字典顺序来排序的。
mod_date:[20020101 TO 20030101]
这将找到mod_date字段在20020101到20030101之间具有值的文档。注意,范围查询不是为日期字段保留的。您还可以使用非日期字段的范围查询:
title:{Aida TO Carmen}
这将会找到所有在Aida和Carmen之间的文件,但不包括Aida和Carmen。
包含范围查询用方括号表示。专用范围查询用花括号表示。
布尔操作符
布尔运算符允许通过逻辑运算符组合项。Lucene支持 AND “+”,OR,NOT和“-”作为布尔运算符(注意:布尔运算符必须是大写的)。
OR操作符是缺省连接操作符。
这意味着,如果在两个术语之间没有布尔运算符,则使用OR操作符。
OR操作符链接两个术语,如果文档中的任一项都存在,就会找到匹配的文档。这相当于一个使用集合的联合。也可以使用||来表示OR。
以下 查询结果一致
“a” b
“a” OR b
“a” || b
AND
AND操作符匹配文档中两个术语都存在的文档。这相当于一个使用集合的交集。符号&&可用于代替单词和单词。
+包含搜索条件
+符号后面的字符必须存在于一个文档的某个字段
+jakarta lucene 必须包含jakarta 不一定包含lucene
NOT
NOT操作符不包含包含该术语的文档。这等价于使用集合的不同。象征!可以代替NOT。
NOT "jakarta apache" 不包含 "jakarta apache"
-不包含搜索条件
"jakarta apache" -"Apache Lucene" 有"jakarta apache",没有"Apache Lucene"
分组
Lucene支持使用圆括号将子句组合成子查询。如果您想要控制查询的布尔逻辑,这将非常有用。
(jakarta OR apache) AND website
字段分组
Lucene支持使用圆括号将多个子句分组到一个单独的字段中。
title:(+return +"pink panther") 既包含return 也包含pink panther的
转义特殊字符
Lucene支持转义特殊字符,这些字符是查询语法的一部分。当前列表的特殊字符是
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \
使用\进行转义:例如,搜索(1+1):2使用查询
\(1\+1\)\:2