Elasticsearch#
Elasticsearch 是一种基于 Lucene 的分布式搜索引擎,就是那个能快速、准确地找到大量数据的搜索引擎。它的查询语言 DSL 可不是一般的强大,支持各种查询方式,比如 bool、match、term、must、should 等等,还能做聚合查询和 plainless 脚本。咱们今天就来学学怎么用这些语句在 ES 里找到想要的数据,让工作变得更加高效。比如说,你要找到某个客户的订单记录,或者查看某个时间段内的销售数据,ES 就能轻松搞定。总之,ES 可不是一般的好用,学会了这些语法和技巧,你的增删改查就更得心应手啦!(再也不用去改别人的查询 DSL 了
- 查询语法
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 不能并列使用。:)
- 聚合查询
聚合查询是 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” 指定了要统计的范围。
- 进阶技巧
除了基本的查询和聚合操作外,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” 是子文档中要查询的字段名。
- 注意事项
在使用 ES 进行增删改查时,需要注意以下几点:
- 搜索 keyword 类型的字段时需要在字段名后加上 “.keyword”
- 嵌套查询时需要使用 nested 查询
- must 和 should 不能并列使用
- 使用 painless 脚本时需要注意安全性和性能问题
总之,在使用 ES 进行增删改查时,需要熟练掌握其 DSL 语句的相关语法和技巧,并注意避免可能遇到的坑。希望本文能够对您有所帮助!
- 参考资料
以上 es 的版本是 6.8.17,我还用过 es 7 版本的,为了支持向量类型字段的搜索。以后单开一篇记录吧