samwellwang

samwellwang

coder
twitter

ES 查询语句

Elasticsearch#

Elasticsearch 是一种基于 Lucene 的分布式搜索引擎,就是那个能快速、准确地找到大量数据的搜索引擎。它的查询语言 DSL 可不是一般的强大,支持各种查询方式,比如 bool、match、term、must、should 等等,还能做聚合查询和 plainless 脚本。咱们今天就来学学怎么用这些语句在 ES 里找到想要的数据,让工作变得更加高效。比如说,你要找到某个客户的订单记录,或者查看某个时间段内的销售数据,ES 就能轻松搞定。总之,ES 可不是一般的好用,学会了这些语法和技巧,你的增删改查就更得心应手啦!(再也不用去改别人的查询 DSL 了

  1. 查询语法

ES 的查询语法主要包括以下几个部分:查询类型、查询条件、过滤条件和排序条件。其中,查询类型包括 match、term、bool 等,查询条件指定要查询的字段和关键字,过滤条件用于对查询结果进行过滤,排序条件用于对查询结果进行排序。

1.1 match 查询

match 查询是 ES 中最常用的一种查询方式,用于在指定字段中查找包含指定关键字的文档。例如,要查找包含 “Elasticsearch” 关键字的文档,可以使用如下 DSL 语句:

{
  "query": {
    "match": {
      "content": "Elasticsearch"
    }
  }
}

其中,“content” 是要查询的字段名,“Elasticsearch” 是要查找的关键字。如果想要在多个字段中查找关键字,可以使用如下语句:

{
  "query": {
    "multi_match": {
      "query": "Elasticsearch",
      "fields": ["title", "content"]
    }
  }
}

1.2 term 查询

term 查询用于精确匹配某个字段的值。例如,要查找 “status” 字段值为 “published” 的文档,可以使用如下 DSL 语句:

{
  "query": {
    "term": {
      "status.keyword": "published"
    }
  }
}

需要注意的是,如果要查询 keyword 类型的字段,需要在字段名后加上 “.keyword”。

1.3 bool 查询

bool 查询用于组合多个查询条件,并支持 must、should、must_not 三种逻辑关系。例如,要查找 “title” 字段中包含 “Elasticsearch” 关键字且 “status” 字段值为 “published” 的文档,可以使用如下 DSL 语句:

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        { "term": { "status.keyword": "published" } }
      ]
    }
  }
}

需要注意的是,must 和 should 不能并列使用。:)

  1. 聚合查询

聚合查询是 ES 中非常有用的一种功能,它可以对查询结果进行分组、统计、排序等操作。ES 支持多种聚合方式,包括 terms、range、date_histogram 等。

2.1 terms 聚合

terms 聚合用于对某个字段进行分组统计。例如,要对 “category” 字段进行分组统计,可以使用如下 DSL 语句:

{
  "aggs": {
    "group_by_category": {
      "terms": {
        "field": "category.keyword"
      }
    }
  }
}

其中,“group_by_category” 是聚合名称,“category.keyword” 是要进行聚合的字段名。

2.2 range 聚合

range 聚合用于对某个字段进行范围统计。例如,要对 “price” 字段进行范围统计,可以使用如下 DSL 语句:

{
  "aggs": {
    "price_range": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 50 },
          { "from": 50, "to": 100 },
          { "from": 100 }
        ]
      }
    }
  }
}

其中,“price_range” 是聚合名称,“price” 是要进行聚合的字段名,“ranges” 指定了要统计的范围。

  1. 进阶技巧

除了基本的查询和聚合操作外,ES 还支持一些进阶技巧,包括 plainless 脚本、nested 查询等。

3.1 painless 脚本

painless 脚本是 ES 中内置的一种脚本语言,支持类似 Java 的语法,并提供了丰富的 API 接口。通过使用 painless 脚本,可以实现更加复杂的数据处理和计算操作。例如,在查询结果中添加一个新的字段 “score”,可以使用如下 DSL 语句:

{
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "score": {
      "script": {
        "lang": "painless",
        "source": "_score * doc['price'].value"
      }
    }
  }
}

其中,“_score” 表示文档得分,“doc ['price'].value” 表示获取 “price” 字段的值。

3.2 nested 查询

nested 查询用于对嵌套在文档中的子文档进行查询。例如,在一个博客系统中,每篇文章可能包含多个评论,每个评论都是一个嵌套在文章中的子文档。要查询所有评论中包含 “Elasticsearch” 的文章,可以使用如下 DSL 语句:

{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "match": {
          "comments.content": "Elasticsearch"
        }
      }
    }
  }
}

其中,“comments” 是子文档名称,“content” 是子文档中要查询的字段名。

  1. 注意事项

在使用 ES 进行增删改查时,需要注意以下几点:

  • 搜索 keyword 类型的字段时需要在字段名后加上 “.keyword”
  • 嵌套查询时需要使用 nested 查询
  • must 和 should 不能并列使用
  • 使用 painless 脚本时需要注意安全性和性能问题

总之,在使用 ES 进行增删改查时,需要熟练掌握其 DSL 语句的相关语法和技巧,并注意避免可能遇到的坑。希望本文能够对您有所帮助!

  1. 参考资料
    以上 es 的版本是 6.8.17,我还用过 es 7 版本的,为了支持向量类型字段的搜索。以后单开一篇记录吧
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。