ElasticSearch query_string 语法样例,收藏备用

快猫星云 2025-01-21 17:41:59

众所周知,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

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat