就是使用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. ZR#710

    雷劈数 题意: 现在给出两个整数,求出位于两个整数之间的所有的"雷劈数. 解法: 因为雷劈数特殊的性质,所以在数据范围中的雷劈数实际很少,直接暴力打表就行. CODE: #include&l ...

  2. python桶排序代码

    代码基于3.8 def bucketSort(nums): #选择一个最大的数 max_num = max(nums) # 创建一个元素全是0的列表, 当做桶 bucket = [0]*(max_nu ...

  3. win10系统配置FTP

    FTP是一种远程传输协议,支持这种协议的就是FTP服务器.我们可以在自己的PC机上创建一个.然后通过网页就可以访问FTP服务器下的文件夹. 搭建过程 1.首先需要开启FTP服务.在菜单中打开控制面板. ...

  4. linux中wget未找到命令

    (转)linux中wget未找到命令   转:https://blog.csdn.net/djj_alice/article/details/80407769 在装数据库的时候发现无法使用wget命令 ...

  5. 查一张表占多少空间Bytes

    SELECT SUM(BYTES)/1024/1024||'MB' 占用空间 FROM dba_segments WHERE segment_name = '表名' AND owner = '用户名' ...

  6. 微pe安装原版win10怎么装|wepe安装原版win10 1803教程

    http://www.xitongcheng.com/jiaocheng/xtazjc_article_42199.html 怎么制作wepe启动盘?微pe是一款全新高效.多功能pe维护工具箱,同时支 ...

  7. python之scrapy模块scrapy-redis使用

    1.redis的使用,自己可以多学习下,个人也是在学习 https://www.cnblogs.com/ywjfx/p/10262662.html官网可以自己搜索下. 2.下载安装scrapy-red ...

  8. PCL中有哪些可用的PointT类型(1)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=266 为了涵盖能想到的所有可能的情况,PCL中定义了大量的point类型.下 ...

  9. [ML] Feature Selectors

    SparkML中关于特征的算法可分为:Extractors(特征提取).Transformers(特征转换).Selectors(特征选择)三部分. Ref: SparkML中三种特征选择算法(Vec ...

  10. React Native pod install报错 `Yoga (= 0.44.3.React)` required by `React/Core (0.44.3)`

    使用pod安装,可能会因为Podfile的路径指向错误或者没有路径指向因为报错. 报错截图如下: 这是因为在指定的路径没有寻找到相应的组件.此时就需要修改podfile文件中的路径,由于上方提示没有  ...