Elasticsearch:人类语言到 Elasticsearch 查询 DSL

Elasticsearch 为开发者提供了强大的搜索功能。Elasticsearch 使用 DSL 来进行查询。对于很多从关系数据库过来的人,这个很显然不很适应。虽然我们可以使用 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" } } }   }   }   }   }   }  }

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

猜你喜欢

转载自blog.csdn.net/UbuntuTouch/article/details/130479870