【Lucene】Lucene 语法

Posted by 西维蜀黍 on 2020-07-06, Last Modified on 2021-09-21

Kibana使用的查询语法是Lucene的查询语法。

布尔操作符

支持多种操作符:

AND

AND操作符用于连接两个搜索条件,仅当两个搜索条件都满足时,才认为匹配。通常用来做交集操作。也可以使用&&替换。 注意必须使用大写。如果不使用AND,而是and,可能会被单做关键词进行搜索!

例如:搜索同时包含a和b的文档

a AND b

或者

a && b

OR

OR操作符用于连接两个搜索条件,当其中一个条件满足时,就认为匹配。通常用来做并集操作。也可以使用||替换。注意必须使用大写。

例如:搜索包含a或者b的文档

a OR b

或者

a || b

默认情况下,会把包含空格的字符串用 OR 解析:

For example, a query string of capital of Hungary is interpreted as capital OR of OR Hungary.

NOT

NOT操作符排除某个搜索条件。通常用来做差集操作也可以使用!替换。注意必须大写。

例如:搜索包含a,不包含b的文档

a NOT b

或者

a && !b

在kibana中支持单独使用,如:排除包含test的文档

NOT test

+ - 加号

文档一直要包含该操作符后跟着的搜索条件,如:搜索包含tom的文档

+tom

也支持在字段中使用小括号。如:要搜索标题中,既包含a也包含b的

title:(+a +"b")

- - 减号

排除该操作符后跟着的搜索条件,如:搜索不包含tom的文档

-tom

如果想要查询语句与文档匹配,那么给定的Term不能出现在文档中。例如:希望搜索到包含关键词lucene,但是不含关键词elasticsearch的文档,可以用如下的查询表达式:"+lucene -elasticsearch"。

效果类似NOT。

通配符查询(Wildcards)

通配符一般包括如下

  • ?:匹配单个字符
  • *:匹配0个或多个字符

语法如下

?tere

意味着搜索there、where等类似的文档

test*

意味着搜索test、tests、tester

正则表达式(Regular Expressions)

Regular expression patterns can be embedded in the query string by wrapping them in forward-slashes ("/"):

name:/joh?n(ath[oa]n)/

See https://www.elastic.co/guide/en/elasticsearch/reference/current/regexp-syntax.html.

范围查询(Ranges)

范围查询允许你指定某个字段最大值和最小值,查询在二者之间的所有文档。范围查询可以包含或者不包含最大值和最小值,排序是按照字典顺序来排序的。

  • ·{}:尖括号表示不包含最小值和最大值,可以单独使用
  • []:方括号表示包含最小值和最大值,可以单独使用。
date:[20020101 TO 20030101] 

如果搜索成绩grade字段小于等于80分,大于60分的,可以写成下面的方式

grade:{60,80]

如果搜索name在A和C之间的,可以使用如下的语法

name:{A,C}

例子

  • All days in 2012:

    date:[2012-01-01 TO 2012-12-31]
    
  • Numbers 1..5

    count:[1 TO 5]
    
  • Tags between alpha and omega, excluding alpha and omega:

    tag:{alpha TO omega}
    
  • Numbers from 10 upwards

    count:[10 TO *]
    
  • Dates before 2012

    date:{* TO 2012-01-01}
    
  • Numbers from 1 up to but not including 5

    count:[1 TO 5}
    
  • Ranges with one side unbounded can use the following syntax:

age:>10
age:>=10
age:<10
age:<=10

转义字符(Reserved Characters)

If you need to use any of the characters which function as operators in your query itself (and not as operators), then you should escape them with a leading backslash. For instance, to search for (1+1)=2, you would need to write your query as \(1\+1\)\=2. When using JSON for the request body, two preceding backslashes (\\) are required; the backslash is a reserved escaping character in JSON strings.

由于Lucene中支持很多的符号,如

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

因此如果需要搜索 (1+1):2 需要对改串进行转换,使用字符\。

\(1\+1\)\:2

域(Field)

Lucene支持多字段数据,当你在查询的时候你可以指定一个字段查询,也可以使用默认的字段。你可以使用字段名:查询词

来指定字段名搜索。举个栗子,让我们假定Lucene的索引中含有两个字段,Title字段和Text字段,其中Text字段是默认字段,当你想找到一篇文档其中标题包含“The Right Way”同时文本中包含“go”,你可以输入:

title:"The Right Way" AND text:go 
或者:

title:"The Right Way" AND go 

例子

  • where the status field contains active

    status:active
    
  • where the title field contains quick or brown

    title:(quick OR brown)
    
  • where the author field contains the exact phrase "john smith"

    author:"John Smith"
    

分组搜索(Grouping Search)

Lucene支持使用括号将子句分组以形成子查询。如果要控制查询的布尔逻辑,这可能非常有用。

(jakarta OR apache) AND jakarta

Reference