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) ...
随机推荐
- Java中final、finally、finalize
简述 final 可以用来修饰类.方法.变量,分别有不同的意义: final 修饰的 class 代表不可以继承扩展: final 的变量是不可以修改的:final 的方法也是不可以重写的(overr ...
- 查看window用户登录日志
查看window用户登录日志 能追踪Windows系统登录时间的三种方法 Windows登录日志详解 事件ID=4798应该对应的是锁定操作(Win+L)
- springMVC课程笔记(二)springMVC组件配置
1.springMVC的DispatcherServlet前段控制器配置,如下图所示在web.xml中配置如下内容: 2.在spring配置文件中,配置处理器适配器HandlerAdapter和映射器 ...
- oracle存储过程中进行分页
create or replace procedure APP_BUSSINESS_CARD_LIST(p_in_str in varchar2,p_out_str out varchar2) is ...
- Nginx之configure选项
1. 通用配置项 --prefix=<path>:Nginx 安装的根路径,所有其他的路径都要依赖于该选项. --sbin-path=<path>:指定 Nginx 二进制文件 ...
- antd源码分析之——标签页(tabs 1.组件结构)
由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第一部分(高亮) 目录 一.组件结构 antd代码结构 rc-ant代码结构 1.组件树状结构 2.Context使用说明 3.rc-t ...
- MySQL 如何使用show processlist进行过滤
在使用show processlist的时候,直接使用会显示很多的内容,无法很快找到需要的信息. 如何过滤操作呢? 其实,show processlist展示的内容是从information_sche ...
- idea忽略隐藏文件、文件夹的设置操作
左上角setting 如果要忽略文件夹,则直接填写文件夹名字即可,例如:要忽略target文件夹[建议:尽量不要把target忽略,因为可能编译出问题排查,还需要查看target文件夹中的编译结果] ...
- Delphi动态事件深入分析
[delphi] view plain copy print? 首先做一个窗体如下 然后单元中如下代码: 在implementation下面声明两个方法如下: //外部方法,只声明一个参数,此时按 ...
- kNN进邻算法
一.算法概述 (1)采用测量不同特征值之间的距离方法进行分类 优点: 精度高.对异常值不敏感.无数据输入假定. 缺点: 计算复杂度高.空间复杂度高. (2)KNN模型的三个要素 kNN算法模型实际上就 ...