天天看点

Apache Lucene查询解析语法

译自: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是默认字段,也可以写成

注意:该字段仅对其直接前面的术语有效,因此查询

只会在标题栏中找到“The”。它将在默认字段中找到“Right”和“Way”(在本例中为文本字段)。

词修饰符

Lucene支持修改查询条件以提供广泛的搜索选项。

通配符搜索

Lucene支持单个和多个字符的通配符搜索(不是在短语查询中)。

要执行单个字符的通配符搜索,使用“?”符号。

要执行一个多字符的通配符搜索使用“*”符号。

单个字符通配符搜索查找与单个字符替换的匹配项。例如,要搜索“text”或“test”,您可以使用搜索:

多个字符通配符搜索查找0或更多字符。例如,为了搜索test, tests or tester,您可以使用搜索:

可以在一个术语的中间使用通配符搜索。

注意:您不能使用*或者?符号作为搜索的第一个字符。

模糊搜索

Lucene支持基于Levenshtein距离的模糊搜索,或者编辑距离算法。要进行模糊搜索,可以使用波浪号,“~”,在一个词的结束时的符号。例如,搜索一个类似于拼写“roam”的词,使用模糊搜索:

可以查询类似roam和roams

从Lucene 1.9开始,一个附加的(可选的)参数可以指定所需的相似性。值在0到1之间,(如果没有给出参数,将使用默认值为0.5。)值更接近1,只有具有更高相似性的条件才会匹配。例如:

临近搜索

Lucene支持在特定的距离内找到单词。要做近距离搜索,使用“~”,一个短语的末尾的符号。例如=>想要搜索包含"hello""world"的文档,这两个单词中间可以有一部分内容(这部分内容通过字符个数限制)

可以匹配"hello 123 world"

或者"hello,Tom,world"

范围搜索

范围查询允许一个匹配域(s)值位于范围查询指定的下界和上界之间的文档。范围查询可以是包容的,也可以是上下限的。排序是按照字典顺序来排序的。

这将找到mod_date字段在20020101到20030101之间具有值的文档。注意,范围查询不是为日期字段保留的。您还可以使用非日期字段的范围查询:

这将会找到所有在Aida和Carmen之间的文件,但不包括Aida和Carmen。

包含范围查询用方括号表示。专用范围查询用花括号表示。

布尔操作符

布尔运算符允许通过逻辑运算符组合项。Lucene支持 AND “+”,OR,NOT和“-”作为布尔运算符(注意:布尔运算符必须是大写的)。

OR操作符是缺省连接操作符。

这意味着,如果在两个术语之间没有布尔运算符,则使用OR操作符。

OR操作符链接两个术语,如果文档中的任一项都存在,就会找到匹配的文档。这相当于一个使用集合的联合。也可以使用||来表示OR。

以下 查询结果一致

“a” b

“a” OR b

“a” || b

AND

AND操作符匹配文档中两个术语都存在的文档。这相当于一个使用集合的交集。符号&&可用于代替单词和单词。

+包含搜索条件

+符号后面的字符必须存在于一个文档的某个字段

NOT

NOT操作符不包含包含该术语的文档。这等价于使用集合的不同。象征!可以代替NOT。

-不包含搜索条件

Lucene支持使用圆括号将子句组合成子查询。如果您想要控制查询的布尔逻辑,这将非常有用。

(jakarta OR apache) AND website

字段分组

Lucene支持使用圆括号将多个子句分组到一个单独的字段中。

转义特殊字符

Lucene支持转义特殊字符,这些字符是查询语法的一部分。当前列表的特殊字符是

 + - && || ! ( ) { } [ ] ^ " ~ * ? : \

使用\进行转义:

例如,搜索(1+1):2使用查询