Elastic Search的聚合搜索
就是使用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的聚合搜索的更多相关文章
- 教你用Elastic Search:运行第一条Hello World搜索命令
摘要:Elastic Search可实时对数据库进行全文检索.处理同义词.从同样的数据中生成分析和聚合数据. 本文分享自华为云社区<Elastic Search入门(一): 简介,安装,运行第一 ...
- Elastic Search快速上手(3):搜索
前言 存储好数据之后,便可通过RESTful API进行搜索. 详细文档可参考: --简单搜索https://www.elastic.co/guide/cn/elasticsearch/guide/c ...
- Elastic Search对Document的搜索
在ES中使用的重点.ES中存储的数据.核心就是为了提供全文搜索能力的.搜索功能非常重要.多练. 1 query string searchsearch的参数都是类似http请求头中的字符串参数提供搜索 ...
- SpringMVC项目使用elastic search搜索
项目需要,引入了elastic search(后续简称es),后面将介绍本地对es的安装,使用以及java连接es查询的整个过程. 1.es索引字段建立与修改,以curl新增一个索引字段示例 curl ...
- Elastic Search笔记
目录 1.简介 2.概念和工具使用 2.1 基本概念 2.2 使用kibana 3.操作索引和数据 2.3 索引 2.4 索引映射到文档 2.5 新增数据 2.6 修改数据 2.7 删除数据 4. 搜 ...
- elastic search(以下简称es)
参考博客园https://www.cnblogs.com/Neeo/p/10304892.html#more 如何学好elasticsearch 除了万能的百度和Google 之外,我们还有一些其他的 ...
- Elastic Search 上市了,市值翻倍,这群人财务自由了!
国庆长假,大部分人还深浸在风花雪月之中,而就在昨天(美国时间10月5号),我们 Java 程序员所熟知的大名鼎鼎的 Elastic Search 居然在美国纽约证券交易所上市了! 当说到搜索时,大部分 ...
- [elastic search][redis] 初试 ElasticSearch / redis
现有项目组,工作需要. http://www.cnblogs.com/xing901022/p/4704319.html Elastic Search权威指南(中文版) https://es.xiao ...
- elastic search 日期为string类型导致视图无法展示时间的解决办法
尝试将结构化的json数据发送到es(elastic search)上,然后创建视图,这样就能以小时维度查看数据,直接使用post发送到es后,创建索引,结果提示 没有date类型的字段(field) ...
随机推荐
- UOJ社区版安装多个Judger
目录 声明 在同一台机器上安装 在不同机子上安装 声明 本文档非官方文档,为我试坑的经验总结. 本文编写时间 2019.11.04 ,并不一定会随UOJ更新而更新. 由于UOJ需要用SVN传题,并不那 ...
- 2016 ACM-ICPC NEERC F. Foreign Postcards (概率DP)
2016 ACM-ICPC NEERC F. Foreign Postcards 题意:有一串由C.W组成的字符串,每次截取长度为k(1<=k<=n且k随机)的前缀,如果该前缀首位为W,则 ...
- python 二分查找代码
二分查找的条件是必须是排好的数字 """二分查找""" def binary_searhc(arr, target): n = len(ar ...
- 如何选CDN:互联网大直播时代的CDN选择指南
转: 如何选CDN:互联网大直播时代的CDN选择指南 from: http://www.chnvideo.com/blog-classic-cdn.html SRS 编码器 如何选CDN:互联网 ...
- Linux设备驱动程序 之 完成量
内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束:这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的某个请求,或者某种类型的硬件动作等: 内核提供 ...
- [Mybatis]查询Sql得到一个字符串
// find min date HashMap<String, String> minDateMap = new HashMap<String, String>(); min ...
- 前端三大框架(Angular Vue React)
前端,HTML(超文本标记语言),CSS(层叠样式表)和JavaScript(脚本语言) HTML,通常说的h5,其实按标准来说,HTML4的后续版本不带编号了,并保证向前的兼容性 CSS的版本3,增 ...
- 使用AWS、Docker与Rancher提供弹性的生产级服务
2017-07-26 开始想你的 RancherLabs AWS Summit 2017 Beijing已经圆满落幕啦!亚马逊公司首席技术官沃纳·威格尔博士莅临现场,分享 AWS 最新云解决方案,把握 ...
- React Native常用的第三方开源库
记录一下自己暂目前了解和使用的一些开源库和官方文档和优秀博客介绍,希望对你有帮助☺️: 1.Toast: https://github.com/magicismight/react-native-ro ...
- jenkins配置记录
jenkins配置记录 http://www.cnblogs.com/kevingrace/p/6022447.html