就是使用ES提供的aggs语法结果,使用DSL搜索的语法,实现聚合数据的统计,查询。
ES中,如果新增document数据的时候,对应的index和type不存在,则自动创建。

1 准备源数据

PUT /products_index/phone_type/1
{
"name":"IPHONE 8",
"remark":"64G",
"price":548800,
"producer":"APPLE",
"tags" : [ "64G", "red color", "Nano SIM" ]
}
PUT /products_index/phone_type/2
{
"name":"IPHONE 8",
"remark":"64G",
"price":548800,
"producer":"APPLE",
"tags" : [ "64G", "golden color", "Nano SIM" ]
}
PUT /products_index/phone_type/3
{
"name":"IPHONE 8 PLUS",
"remark":"128G",
"price":748800,
"producer":"APPLE",
"tags" : [ "128G", "red color", "Nano SIM" ]
}
PUT /products_index/phone_type/4
{
"name":"IPHONE 8 PLUS",
"remark":"256G",
"price":888800,
"producer":"APPLE",
"tags" : [ "256G", "golden color", "Nano SIM" ]
}

将文本类型的field的fielddata设置为true。用于设置ES中对倒排索引的设置,将倒排索引内容重设一份正排索引,并提供内存存储计算能力。

正排索引,类似数据库中的普通索引。依赖倒排索引中的数据,不做二次解析,将倒排索引解析的数据信息,建立一个索引,索引用于内存计算,如:分析,分组,字符串排序等。

PUT /products_index/_mapping/phone_type
{
"properties" : {
"tags" : {
"type" : "text",
"fielddata" : true
}
}
}

  

2 聚合统计
计算每个tag中的Document数量
terms : 检索词组的,安装标准词组分组,统计数据document的数量。类似数据库中的count。
聚合搜索,语法的大体结构和DSL搜索语句类似。类似数据库中的count。 Select count(*) from table

GET /products_index/phone_type/_search
{
"size" : 0, # 查多少数据。
"aggs" : { # 开始聚合,类似query,是一个命令。或api
"group_by_tags":{ # 给聚合数据,加一个命名。自定义。
"terms" : { # 是一个聚合api,类似数据库中的聚合函数。解析某字段中的词条。如:a字段的值是 test field.假设解析后词条为test和field。那么就是根据a字段的解析词条,test和field来统计每个数据在多少个document中存在。
"field" : "tags"
}
}
}
}

"size":0代表显示多少计算源数据Document

3 增加搜索匹配条件的聚合统计
搜索名称中包含PLUS的Document,并计算每个tag中的Document数量。统计是search中的一部分。一般在DSL query中使用。所以经常和条件搜索配合完成统计。

GET /products_index/phone_type/_search
{
"size" : 0,
"query" : {
"match" : { "name" : "PLUS" }
},
"aggs" : {
"group_by_tags":{
"terms" : { "field" : "tags" }
}
}
}

  

4 聚合后实现计算
聚合嵌套

# 计算name中包含plus的document数据中的price字段平均值。
GET /products_index/phone_type/_search
{
"query": {
"match": {
"name": "plus"
}
},
"aggs": {
"avg_by_price" : {
"avg": {
"field": "price"
}
}
}
} # 搜索包含plus的document,根据tags做词条统计,在统计结果中,计算price平均值。聚合是可以嵌套的,内层聚合是依托于外层聚合的结果之上,实现聚合计算的。
GET /products_index/phone_type/_search
{
"query": {
"match": {
"name": "plus"
}
},
"aggs": {
"group_by_tags":{
"terms": {
"field": "tags"
},
"aggs": {
"avg_by_price": {
"avg": {
"field": "price"
}
}
}
}
}
}

  

5 聚合的排序
类似SQL - select * from group by .. order by ..
聚合aggs中如果使用order排序的话,要求排序字段必须是一个aggs聚合相关的字段。聚合相关字段代表的含义是:当前聚合的子聚合命名。如:外部聚合是使用terms实现的聚合,命名为group_by_tags,其内层聚合是使用avg计算平均值,聚合名称为avg_by_price,那么avg_by_price称为聚合相关字段。
计算每个tag中的Document数据的price平均值,并根据price字段数据排序

GET /products_index/phone_type/_search
{
"size" : 0,
"aggs" : {
"group_by_tags" : {
"terms" : { "field" : "tags", "order":{"avg_price" : "desc"} },
"aggs" : {
"avg_price" : {
"avg" : { "field" : "price" }
}
}
}
}
}

  

6 范围分组并计算
使用price取值范围分组,再计算分组Document中price的平均值

GET /products_index/phone_type/_search
{
"query": {
"match_all": {}
},
"_source": "price",
"aggs": {
"range_by_price": {
"range": {
"field": "price",
"ranges": [
{
"from": 500000,
"to": 600000
},
{
"from": 600001,
"to": 800000
},
{
"from": 800001,
"to": 1000000
}
]
},
"aggs": {
"avg_by_price": {
"avg": {
"field": "price"
}
}
}
}
}
}

Elastic Search的聚合搜索的更多相关文章

  1. 教你用Elastic Search:运行第一条Hello World搜索命令

    摘要:Elastic Search可实时对数据库进行全文检索.处理同义词.从同样的数据中生成分析和聚合数据. 本文分享自华为云社区<Elastic Search入门(一): 简介,安装,运行第一 ...

  2. Elastic Search快速上手(3):搜索

    前言 存储好数据之后,便可通过RESTful API进行搜索. 详细文档可参考: --简单搜索https://www.elastic.co/guide/cn/elasticsearch/guide/c ...

  3. Elastic Search对Document的搜索

    在ES中使用的重点.ES中存储的数据.核心就是为了提供全文搜索能力的.搜索功能非常重要.多练. 1 query string searchsearch的参数都是类似http请求头中的字符串参数提供搜索 ...

  4. SpringMVC项目使用elastic search搜索

    项目需要,引入了elastic search(后续简称es),后面将介绍本地对es的安装,使用以及java连接es查询的整个过程. 1.es索引字段建立与修改,以curl新增一个索引字段示例 curl ...

  5. Elastic Search笔记

    目录 1.简介 2.概念和工具使用 2.1 基本概念 2.2 使用kibana 3.操作索引和数据 2.3 索引 2.4 索引映射到文档 2.5 新增数据 2.6 修改数据 2.7 删除数据 4. 搜 ...

  6. elastic search(以下简称es)

    参考博客园https://www.cnblogs.com/Neeo/p/10304892.html#more 如何学好elasticsearch 除了万能的百度和Google 之外,我们还有一些其他的 ...

  7. Elastic Search 上市了,市值翻倍,这群人财务自由了!

    国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约证券交易所上市了! 当说到搜索时,大部分 ...

  8. [elastic search][redis] 初试 ElasticSearch / redis

    现有项目组,工作需要. http://www.cnblogs.com/xing901022/p/4704319.html Elastic Search权威指南(中文版) https://es.xiao ...

  9. elastic search 日期为string类型导致视图无法展示时间的解决办法

    尝试将结构化的json数据发送到es(elastic search)上,然后创建视图,这样就能以小时维度查看数据,直接使用post发送到es后,创建索引,结果提示 没有date类型的字段(field) ...

随机推荐

  1. sql到python正则

    import urllib.requestimport re,timeresult=[]for i in range(100):    urls ="http://xxx.com/-1%20 ...

  2. [CSP-S模拟测试]:B(期望DP)

    题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...

  3. MySQL| MySQL关键字和保留字

    MySQL 5.5 Keywords and Reserved Words The following list shows the keywords and reserved words in My ...

  4. Linux如何修改环境变量

    如果想要环境变量永久生效可以修改下面两个文件中的任何一个: 1 /etc/profile 2 .bash_profile 其中,/etc/profile是全局的环境变量,对所有用户生效,而.bash_ ...

  5. 【零基础】speech driven animation中文安装使用指南

    注:原项目名叫Speech-Driven Animation,所以我这里就简称为SDA 开局一张图,后面自动编 相信前段时间爆火的DeepNude(AI扒衣)让很多人惊掉了大牙,AI还能干这个?!如果 ...

  6. 深度学习之Seq_seq网络

    知识点 """ 机器翻译: 历史: 1.逐字翻译 2.基于统计学的机器翻译 3.循环网络和编码 翻译过程: 输入 -- > encoder -->向量 --& ...

  7. python用cx_Oracle连接oracle

    确认版本: oracle版本:64位 python版本:64位 下载cx_Oracle的whl包:64位 安装whl包:pip install wheel cd到下载路径安装cx_Oracle的whl ...

  8. c++ STL之map

    map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,map中的元素是自动按Key升序排序,所以不能对map用sort函数: ...

  9. MongoDB的安装及配置(Win7)

    一.下载MongoDB 登录Mongodb官网https://www.mongodb.com/download-center#community 二.安装MongoDB 安装真的比较简单 next就可 ...

  10. Django Model模型

    Model简介 模型准确且唯一的描述了数据.它包含您储存的数据的重要字段和行为.一般来说,每一个模型都映射一张数据库表. 每个模型都是一个 Python 的类,这些类继承 django.db.mode ...