Elasticsearch:人类语言到 Elasticsearch 查询 DSL

474 阅读3分钟

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)
]()```

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8b13d13a0ab449ce8c25f61d6d68c362~tplv-k3u1fbpfcp-zoom-1.image)

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ea1629d9ead540c7ae20ab9ec5733238~tplv-k3u1fbpfcp-zoom-1.image)

![图片转存失败,建议将图片保存下来直接上传 `

  1. {
  2. "size": 0,
  3. "aggs": {
  4.  "monthly_visits": {
    
  5.    "date_histogram": {
    
  6.      "field": "date",
    
  7.      "interval": "month" 
    
  8.    },
    
  9.    "aggs": {
    
  10.      "avg_visits": { 
    
  11.        "avg": {"field" : "visits"} 
    
  12.      }  
    
  13.    }  
    
  14.  }  												     }  
    
  15. }

` (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" } } }   }   }   }   }   }  }


 好了,今天我就展示到这里。你可以使用上面的工具做更多的试验。