Elasticsearch 为开发者提供了强大的搜索功能。Elasticsearch 使用 DSL 来进行查询。对于很多从关系数据库过来的人,这个很显然不很适应。虽然我们可以使用 SQL 来进行查询,但是我们必须通过一些命令来进行转换。我们可以通过阅读文章:
-
Elasticsearch:Elasticsearch SQL介绍及实例 (一)
-
Elasticsearch:Elasticsearch SQL介绍及实例(二)
来了解更多。幸运的是,目前 Elastic 在从事 ESQL 的研发,并在不久的将来和开发者见面。你可以阅读文章 “Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言”。
在今天的文章中,我来详细介绍一下一个网络上的工具。它可以帮助我们从人类语言的描述到 DSL 查询的转换。它的网址是 https://www.dsltranslate.com/。虽然我不知道它是如何实现的,但是从实现的方式上感觉非常像 ChatGPT。
示例一
找出最大值:
上面输出的结果是:
{
"size": 0,
"aggs": {
"max_value": {
"max": {
"field": "_value"
}
}
}
}
我们在上面的输入框中输入中文字:
我们可以看到可以得到同样的结果。
示例二
显示所有价格从 100.000 USD 到 200.00 USD 的红色汽车:
我们可以看到的结果是:
{
"query": {
"bool": {
"must": [
{ "match": { "color": "red" }},
{
"range" : {
"price" : {
"gte" : 100000,
"lte" : 200000
}
}
}
]
}
}
}
我们尝试使用中文来进行操作:
从上面的输出中,我们可以得到同样的结果。
示例三
查找每个每个时间桶里的最大值及平均值:
上面的结果为:
{
"size": 0,
"aggs": {
"time_buckets": {
"date_histogram": {
"field": "timestamp",
"interval": "1h"
},
"aggs": {
"max_value": {
"max": {
"field": "value"
}
},
"avg_value": {
"avg": {
"field": "value"
}
}
}
}
}
}
示例三
在每个时间桶中找到前 3 个术语:
上面显示的结果为:
{
"size": 0,
"aggs": {
"time_buckets": {
"date_histogram": {
"field": "@timestamp",
"interval": "<time bucket>"
},
"aggs": {
"top_terms": {
"terms": {
"field": "<field>",
"size" : 3,
"order" : { "_count" : "desc"}
}
}
}
}
}
}
示例四
我们添加如下的 mapping:
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "dateOptionalTime"
},
"visits": {
"type": "integer"
},
"max_time_spent": {
"type": "integer"
}
}
}
}
{
"size": 0,
"aggs": {
"monthly_visits": {
"date_histogram": {
"field": "date",
"interval": "month"
},
"aggs": {
"avg_visits": {
"avg": {"field" : "visits"}
}
}
} }
}
示例五
找出每个时间桶的前 3 个术语的百分比:
上面输出的结果为:
{
"size": 0,
"aggs": {
"time_buckets": {
"date_histogram": {
"field": "date",
"interval" : "1h"
},
"aggs": {
"top_3_terms": {
"terms": {
"field": "_type",
"size" : 3,
"order" : { "_count" : "desc"} },
aggs: {
percentage: { bucket_script: { script: "_count * 100 / sum(total)", buckets_path: { total: "_count" } } } } } } } } }
好了,今天我就展示到这里。你可以使用上面的工具做更多的试验。