【Elasticsearch】-聚合查询

ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)。

聚合计算的值可以取字段的值,也可是脚本计算的结果。查询请求体中以aggregations节点的语法定义

"aggregations" : {                        //也可简写为 aggs

    "" : {      //聚合的名字

        "" : {     //聚合的类型

                 //聚合体:对哪些字段进行聚合

        }

        [,"meta" : {  [] } ]?                 //元

        [,"aggregations" : { []+ } ]?   //在聚合里面在定义子聚合

    }

    [,"" : { ... } ]*                      //聚合的名字

}

单值输出

ES中大多数的数学计算只能输出一个值,比如max、min、avg、sum、cardinality

GET indexName/_search

{

  "aggs"{

   "aggs_name":{  #聚合分析的名字有用户自定义

    "aggs_type":{


         }   

    }

 }

}

多值输出

stats

查询员工工资信息,包括数量、最大值、最小值、平均值、和。

要求字段属性必须是数值类型

GET employee/_search

{

  "size": 0, 

  "aggs": {

    "sal_info": {

      "stats": {

        "field": "sal"

      }

    }

  }

}


terms

查询到达不同国家的航班数量,对数据进行分组并统计出每一组总数。

以下api是按照目的地进行分组,没统计到达每个国家航班的数量

GET kibana_sample_data_flights/_search

{

  "size": 0, 

  "aggs": {

    "aaaa": {

      "terms": {

        "field": "DestCountry",

        "size": 10

      }

    }

  }

}

top_hits

年龄最大的两个员工

GET employee/_search

{

  "size": 0, 

  "aggs": {

    "max_two_age": {

      "top_hits": {

        "size": 2

        , "sort": [{

          "age": {"order": "desc"}

        }]

      }

    }

  }

}

range

请注意,此聚合包括每个范围的from值,不包括to值。

例如查询不同工资区间员工工资的统计信息

GET employee/_search

{

  "size": 0, 

  "aggs": {

    "range_sal_info": {

      "range": {

        "field": "sal"

        , "ranges": [

          {"key":"0 <= sal < 10001",

            "to": 10001

          },

          {"key": "10001<= sal <20001",

            "from": 10001,

            "to": 20001

          },

          {"key": "20001<= sal <30001",

            "from": 20001,

            "to": 30001

          }

        ]

              }

    }

  }

}


histogram

以某个固定值为区间查询某个范围内的聚合

比如以5000为固定值,查询工资区间的信息

GET employee/_search

{

  "size": 0, 

  "aggs": {

    "range_sal_info": {

      "histogram": {

        "field": "sal",

        "interval": 5000,

        "extended_bounds": {

          "min": 5000,

          "max": 20000

        }

              }

    }

  }

}


min_bucket

A sibling pipeline aggregation which identifies the bucket(s) with the minimum value of a specified metric in a sibling aggregation and outputs both the value and the key(s) of the bucket(s). The specified metric must be numeric and the sibling aggregation must be a multi-bucket aggregation.

分组后最小的桶.

查询平均工资最低的工种

GET employee/_search

{"size": 0,

  "aggs": {

    "job_info": {

      "terms": {

        "field": "job"

      },

      "aggs": {

        "diff_job_avg_sal": {

          "avg": {

            "field": "sal"

          }

        }

      }

    },

    "min_avg_job_info":{

        "min_bucket":{

          "buckets_path":"job_info>diff_job_avg_sal"

        }

      }

  }

}

全局过滤

查询年龄大于30岁的员工平均工资

GET employee/_search

{

  "size": 0, 

  "query": {

    "range": {

      "age": {

        "gt": 30

      }

    }

  },

  "aggs": {

    "gt_30_avg_info": {

      "avg": {

        "field": "sal"

      }

    }

  }

}

查询岗位为JAVA开发的平均工资,使用constant_score,不计算相关性分数

GET employee/_search

{

  "size": 0, 

  "query": {

    "constant_score": {

      "filter": {

        "term": {

          "job": "java"

          

        }

        }

      }

  },

  "aggs": {

    "gt_30_avg_info": {

      "avg": {

        "field": "sal"

      }

    }

  }

}

局部过滤

查询所有员工平均工资和年龄大于30岁的平均工资

GET employee/_search

{

  "size": 0, 

  "aggs": {

    "all_emp_agv_sal": {

      "avg": {

        "field": "sal"

      }

    },

    "gt_30_emp_avg_info":{

      "filter": {

        "range": {

          "age": {

            "gt": 30

          }

        }

      }

    , "aggs": {

      "NAME": {

        "avg": {

          "field": "sal"

        }

      }

    }

    }

  }

}

推荐搜索

suggest

在搜索过程中,因为单词的拼写错误,没有得到任何的结果,希望ES能给我们一个推荐的搜索。

GET movies/_search

{

  "suggest": {

    "YOUR_SUGGESTION": {

      "text": "beauty",

      "term": {

        "field": "title",

        "suggest_mode":"missing"

      }

    }

  }

}

suggestJ_mode,有三个值:popular、missing 、always。默认时missing

  1. popular 是推荐词频更高的一些搜索
  2. missing 是当没有要搜索的结果时才推荐,倒排索引中没有此关键次。
  3. always 无论什么情况下都进行推荐

自动补全

completion

自动补全是我们在日常开发过程中最常见的搜索方式,比如百度搜索、淘宝的商品搜索。

es是通过特殊的数据结构实现,并不是通过传统意义的倒排索引实现。

前缀搜索API,其中size,限制返回多少条数据,skip_duplicates是自动去重。

GET movies/_search

{

  "suggest": {

    "YOUR_SUGGESTION": {

       "prefix" : "beauty",

      "completion" : {

        "field" : "title",

        "size":"20",

        "skip_duplicates":"true"

      }

      }

  }

}

高亮显示

将搜索结果进行高亮显示。

# 将title和genre中所有的romance进行高亮显示,通过pre_tages和post_tags定制前缀标签和后缀标签。

GET movies/_search

{

  "query": {

    "multi_match": {

      "query": "romance",

      "fields": ["title","genre"]

    }

  },

  "highlight": {

    "pre_tags": "",

    "post_tags": "",  

    "fields": {

      "title": {},

      "genre": {}

    }

  }

}



GET movies/_search

{

  "query": {

   "bool": {

     "must": [

       {"match": {

         "year": 2012

        }

       },

       {"match":{

         "title": "Avengers, The"

        }

       }

      

     ]

   }

},

"highlight": {

"fields": {

  "year": {}, 

  "genre": {

    "pre_tags": "",

    "post_tags": "",

    "highlight_query": {

      "match": {

        "genre": "Action"

      }

    }

  }

}

}

}

上一篇:linux文本文件处理命令


下一篇:【Elasticsearch】-文本分析