ElasticSearch DSL

2018/05/25 Tool

简介

ElasticSearch 使用自定义的 json 格式的语句进行各种各样的查询。

简单查询

Bool Query

Bool Query 可以将很多查询条件组合起来, 组合条件支持 must, must_nout, should, filter

{
  "query" : {
    "bool" : {
      "must" : [ {
        "query_string" : {
          "query" : "\"com.tencent.mm\"",
          "fields" : [ "pkg" ]
        }
      }, {
        "query_string" : {
          "query" : "\"com.xiaomi.channel\"",
          "fields" : [ "pkg" ]
        }
      } ]
    }
  }
}

Exist Query

 {
  "from" : 0,
  "size" : 10,
  "query" : {
    "exists":{
        "field":"age"
    }
  }
}

Nested Query

Nested 文档需要在外层包裹一层 nested, 并指定 path

 {
  "from" : 0,
  "size" : 10,
  "query" : {
      "nested":{
          "path":"apps",
          "query":{
            "exists":{
                "field":"apps.scene_class"
            }
          }
      }
  }
}

聚合查询

聚合查询分为 metric 聚合和 Bucketing 聚合, 两者又可以嵌套起来使用, 查询格式如下:

"aggregations" : {                  // 表示聚合操作,可以使用aggs替代
    "<aggregation_name>" : {        // 聚合名,可以是任意的字符串。用做响应的key,便于快速取得正确的响应数据。
        "<aggregation_type>" : {    // 聚合类别,就是各种类型的聚合,如min等
            "<aggregation_body>":{}// 聚合体,不同的聚合有不同的body
        }
        [,"aggregations" : {  }]    // 嵌套的子聚合,可以有0或多个
    }
    [,"<aggregation_name_2>" : {  } ] // 另外的聚合,可以有0或多个
}

返回结果格式为:

{
"aggregations": {                    // 聚合结果
    "<aggregation_name>": {          // 前面输入的聚合名
       "<aggregation_body>":{}             // 聚合后的数据 不同的聚合格式可能不同
    }
  }
}

聚合也可以嵌套使用 filter, 如下中内部嵌套的聚合是经过 filter 过滤后的文档集合中进行聚合:

{
    "aggregations" : {
        "<aggregation_name>" : {
            "filter" : "<query_body>",
            "aggregations" : {
                "<aggregation_name>" : "<aggregation_body>"
            }
        }
    }
}

metric

metric 聚合用于对数字类型的数据进行计算。

Min Aggregation

获取最小值

{
  "query": {},
  "aggs": {
    "min_age": {
      "min": {
        "field": "age"
      }
    }
  }
}

Max Aggregation

获取最大值

{
  "query": {}, 
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    }
  }
}

Sum Aggregation

求和

{
  "query": {}, 
  "aggs": {
    "sum_age": {
      "sum": {
        "field": "age"
      }
    }
  }
}

Avg Aggregation

计算平均值

{
  "query": {}, 
  "aggs": {
    "avg_age": {
      "avg": {
        "field": "age"
      }
    }
  }
}

NOTE: 计算的时候字段不存在的文档将被忽略, 也就是分子不算其值, 分母不 +1, 除非使用 "avg":{"field":"age","missing":10} 设置其默认值

Bucketing

普通分组

{
  "query": {}, 
  "aggs": {
    "brand": {
      "terms": {
        "field": "brand"
      }
    },
    "size":50
  }
}

Search

    Table of Contents