ElasticSearch query_string 语法样例,收藏备用
众所周知,ElasticSearch 支持多种不同的检索语法,比如 DSL、SQL、EQL 等,其中 DSL 中的 query_string
极为灵活,甚至可以看做是和其他语法同等重要的一种语法。夜莺的日志监控就是支持的 query_string,但是大家查询日志更习惯的可能是 KQL,对 query_string 的方式略显陌生,所以这里给大家分享一些 query_string 的样例,供大家收藏备用。
数据集:
我这个数据集很简单,只有两条数据,使用 SQL 方式查询,展示为 txt 方式,便于查看:
POST /_sql?format=txt
{
"query": "select * from blog"
}
从上面的 SQL 可以看出,我的索引叫 blog,查询结果如下:
author | content | published_date | title
---------------+----------------------+------------------------+-----------------------------
qin |java language is great|2023-01-01T00:00:00.000Z|first blog: java intro
xiaohui |prometheus is great |2023-01-02T00:00:00.000Z|second blog: prometheus intro
query_string 样例
1. 类似 match 的查询
GET blog/_search
{
"query": {
"query_string": {
"query": "title:java intro"
}
}
}
上面的查询会返回两条记录。因为两条记录的 title 字段都包含了 intro
这个关键字。如果只想返回第一条记录,中间就要加上 AND,即:title:java AND intro
,当然,加上括号可能更清晰:title:(java AND intro)
。
夜莺的过滤条件里,只写 title:(java AND intro)
就可以了,不要把整个 JSON 都写进去。
2. 类似 match_phrase 的查询
GET blog/_search
{
"query": {
"query_string": {
"query": "title:\"java intro\""
}
}
}
在 java intro
外侧加上双引号,表示要精确匹配这个短语,这个查询只会返回第一条记录。
3. 类似 wildcard 的查询
GET blog/_search
{
"query": {
"query_string": {
"query": "title:sec*"
}
}
}
上面的查询会返回第二条记录,因为第二条记录的 title 字段以 sec
开头。注意上面的 sec 后面的那个 *
,表示 0 个或多个任意字符。
4. 类似 range 的查询
GET blog/_search
{
"query": {
"query_string": {
"query": "published_date:>=2023-01-01"
}
}
}
上面的查询会返回两条记录,因为两条记录的 published_date 字段都大于等于 2023-01-01
。如果只想返回第一条记录,可以这么写:published_date:>=2023-01-01 AND <2023-01-02
。
还有另一种写法,published_date:[2023-01-01 TO 2023-01-02]
,这个写法会把两条记录都返回。
5. exists 查询
GET blog/_search
{
"query": {
"query_string": {
"query": "_exists_:title"
}
}
}
返回两条记录,因为两条记录的 title 字段都存在。
6. 多个字段同时满足条件
GET blog/_search
{
"query": {
"query_string": {
"query": "_exists_:title AND content:prometheus AND published_date:>2023"
}
}
}
上例是三个查询条件拼在一起,会返回第二条记录。
总结
上面的几个样例帮你入门,找找感觉。更详细的 query_string 语法可以参考 ElasticSearch 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html。