从 sql 到弹性搜索查询的转换

Conversion from sql to elastic search query

我要转换foll。 sql 查询到弹性 json 查询

select count(distinct(fk_id)),city_id from table 
where status1 != "xyz" and satus2 = "abc" and 
cr_date >="date1" and cr_date<="date2" group by city_id

还有什么方法可以在 elastic 中编写嵌套查询。

select * from table where status in (select status from table2)

第一个查询在 Elasticsearch 查询 DSL 中可以这样翻译:

curl -XPOST localhost:9200/table/_search -d '{
  "size": 0,
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "status2": "abc"
              }
            },
            {
              "range": {
                "cr_date": {
                  "gt": "date1",    <--- don't forget to change the date
                  "lt": "date2"     <--- don't forget to change the date
                }
              }
            }
          ],
          "must_not": [
            {
              "term": {
                "status1": "xyz"
              }
            }
          ]
        }
      }
    }
  },
  "aggs": {
    "by_cities": {
      "terms": {
        "field": "city_id"
      },
      "aggs": {
        "fk_count": {
          "cardinality": {
            "field": "fk_id"
          }
        }
      }
    }
  }
}'

使用Sql API 在Elasticsearch中,我们可以编写查询,也可以将它们翻译成弹性查询

 POST /_sql/translate
{
    "query": "SELECT * FROM customer where address.Street='JanaChaitanya Layout' and Name='Pavan Kumar'"
}

对此的回应是

{
  "size" : 1000,
  "query" : {
    "bool" : {
      "must" : [
        {
          "term" : {
            "address.Street.keyword" : {
              "value" : "JanaChaitanya Layout",
              "boost" : 1.0
            }
          }
        },
        {
          "term" : {
            "Name.keyword" : {
              "value" : "Pavan Kumar",
              "boost" : 1.0
            }
          }
        }
      ],
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  },
  "_source" : {
    "includes" : [
      "Name",
      "address.Area",
      "address.Street"
    ],
    "excludes" : [ ]
  },
  "docvalue_fields" : [
    {
      "field" : "Age"
    }
  ],
  "sort" : [
    {
      "_doc" : {
        "order" : "asc"
      }
    }
  ]
}

现在我们可以使用这个结果来查询elasticsearch 有关更多详细信息,请阅读本文

https://xyzcoder.github.io/elasticsearch/2019/06/25/making-use-of-sql-rest-api-in-elastic-search-to-write-queries-easily.html