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
andomega
, excludingalpha
andomega
: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 containsactive
status:active
-
where the
title
field containsquick
orbrown
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
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax
- https://lucene.apache.org/core/6_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html
- https://www.gowhich.com/blog/861