Elasticsearch 为开发者提供了强大的搜索功能。Elasticsearch 使用 DSL 来进行查询。对于很多从关系数据库过来的人,这个很显然不很适应。虽然我们可以使用 SQL 来进行查询,但是我们必须通过一些命令来进行转换。我们可以通过阅读文章:
来了解更多。幸运的是,目前 Elastic 在从事 ESQL 的研发,并在不久的将来和开发者见面。你可以阅读文章 “Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言”。
在今天的文章中,我来详细介绍一下一个网络上的工具。它可以帮助我们从人类语言的描述到 DSL 查询的转换。它的网址是 www.dsltranslate.com/。虽然我不知道它是如何实现的,但是从实现的方式上感觉非常像 ChatGPT。
示例一
找出最大值:
上面输出的结果是:
1. {
2. "size": 0,
3. "aggs": {
4. "max_value": {
5. "max": {
6. "field": "_value"
7. }
8. }
9. }
10. }
我们在上面的输入框中输入中文字:
我们可以看到可以得到同样的结果。
示例二
显示所有价格从 100.000 USD 到 200.00 USD 的红色汽车:
我们可以看到的结果是:
1. {
2. "query": {
3. "bool": {
4. "must": [
5. { "match": { "color": "red" }},
6. {
7. "range" : {
8. "price" : {
9. "gte" : 100000,
10. "lte" : 200000
11. }
12. }
13. }
14. ]
15. }
16. }
17. }
我们尝试使用中文来进行操作:
从上面的输出中,我们可以得到同样的结果。
示例三
查找每个每个时间桶里的最大值及平均值:
上面的结果为:
1. {
2. "size": 0,
3. "aggs": {
4. "time_buckets": {
5. "date_histogram": {
6. "field": "timestamp",
7. "interval": "1h"
8. },
9. "aggs": {
10. "max_value": {
11. "max": {
12. "field": "value"
13. }
14. },
15. "avg_value": {
16. "avg": {
17. "field": "value"
18. }
19. }
20. }
21. }
23. }
25. }
示例三
在每个时间桶中找到前 3 个术语:
上面显示的结果为:
1. {
2. "size": 0,
3. "aggs": {
4. "time_buckets": {
5. "date_histogram": {
6. "field": "@timestamp",
7. "interval": "<time bucket>"
8. },
9. "aggs": {
10. "top_terms": {
11. "terms": {
12. "field": "<field>",
13. "size" : 3,
14. "order" : { "_count" : "desc"}
15. }
16. }
17. }
18. }
19. }
20. }
示例四
我们添加如下的 mapping:
![图片转存失败,建议将图片保存下来直接上传
`
1. {
2. "mappings": {
3. "properties": {
4. "date": {
5. "type": "date",
6. "format": "dateOptionalTime"
7. },
8. "visits": {
9. "type": "integer"
10. },
11. "max_time_spent": {
12. "type": "integer"
13. }
14. }
15. }
16. }
` (https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
]()```


![图片转存失败,建议将图片保存下来直接上传 `
- {
- "size": 0,
- "aggs": {
-
"monthly_visits": { -
"date_histogram": { -
"field": "date", -
"interval": "month" -
}, -
"aggs": { -
"avg_visits": { -
"avg": {"field" : "visits"} -
} -
} -
} } - }
` (csdnimg.cn/release/blo…) ]()```
示例五
找出每个时间桶的前 3 个术语的百分比:
上面输出的结果为:
1. {
2. "size": 0,
3. "aggs": {
4. "time_buckets": {
5. "date_histogram": {
6. "field": "date",
7. "interval" : "1h"
8. },
9. "aggs": {
10. "top_3_terms": {
11. "terms": {
12. "field": "_type",
13. "size" : 3,
14. "order" : { "_count" : "desc"} },
15. aggs: {
16. percentage: { bucket_script: { script: "_count * 100 / sum(total)", buckets_path: { total: "_count" } } } } } } } } }
好了,今天我就展示到这里。你可以使用上面的工具做更多的试验。