好玩的es--第四篇之聚合查询和集群(代码片段)

热爱编程的大忽悠 热爱编程的大忽悠     2023-01-22     623

关键词:

好玩的ES--第四篇之聚合查询和集群


聚合查询

简介

聚合:英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能。聚合有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。

注意事项:text类型是不支持聚合的。


测试数据

# 创建索引 index 和映射 mapping
PUT /fruit

  "mappings": 
    "properties": 
      "title":
        "type": "keyword"
      ,
      "price":
        "type":"double"
      ,
      "description":
        "type": "text",
        "analyzer": "ik_max_word"
      
    
  

-
# 放入测试数据
PUT /fruit/_bulk
"index":
  "title" : "面包","price" : 19.9,"description" : "小面包非常好吃"
"index":
  "title" : "旺仔牛奶","price" : 29.9,"description" : "非常好喝"
"index":
  "title" : "日本豆","price" : 19.9,"description" : "日本豆非常好吃"
"index":
  "title" : "小馒头","price" : 19.9,"description" : "小馒头非常好吃"
"index":
  "title" : "大辣片","price" : 39.9,"description" : "大辣片非常好吃"
"index":
  "title" : "透心凉","price" : 9.9,"description" : "透心凉非常好喝"
"index":
  "title" : "小浣熊","price" : 19.9,"description" : "童年的味道"
"index":
  "title" : "海苔","price" : 19.9,"description" : "海的味道"

使用

根据某个字段分组

# 根据某个字段进行分组 统计数量
GET /fruit/_search

  "query": 
    "term": 
      "description": 
        "value": "好吃"
      
    
  , 
  "aggs": 
    "price_group": 
      "terms": 
        "field": "price"
      
    
  

求最大值

# 求最大值 
GET /fruit/_search

  "aggs": 
    "price_max": 
      "max": 
        "field": "price"
      
    
  

求最小值

# 求最小值
GET /fruit/_search

  "aggs": 
    "price_min": 
      "min": 
        "field": "price"
      
    
  

求平均值

# 求平均值
GET /fruit/_search

  "aggs": 
    "price_agv": 
      "avg": 
        "field": "price"
      
    
  

求和

# 求和
GET /fruit/_search

  "aggs": 
    "price_sum": 
      "sum": 
        "field": "price"
      
    
  

整合应用

// 求不同价格的数量
@Test
public void testAggsPrice() throws IOException 
  SearchRequest searchRequest = new SearchRequest("fruit");
  SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  sourceBuilder.aggregation(AggregationBuilders.terms("group_price").field("price"));
  searchRequest.source(sourceBuilder);
  SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  Aggregations aggregations = searchResponse.getAggregations();
  ParsedDoubleTerms terms = aggregations.get("group_price");
  List<? extends Terms.Bucket> buckets = terms.getBuckets();
  for (Terms.Bucket bucket : buckets) 
    System.out.println(bucket.getKey() + ", "+ bucket.getDocCount());
  

// 求不同名称的数量
@Test
public void testAggsTitle() throws IOException 
  SearchRequest searchRequest = new SearchRequest("fruit");
  SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  sourceBuilder.aggregation(AggregationBuilders.terms("group_title").field("title"));
  searchRequest.source(sourceBuilder);
  SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  Aggregations aggregations = searchResponse.getAggregations();
  ParsedStringTerms terms = aggregations.get("group_title");
  List<? extends Terms.Bucket> buckets = terms.getBuckets();
  for (Terms.Bucket bucket : buckets) 
  	System.out.println(bucket.getKey() + ", "+ bucket.getDocCount());
  

// 求和
@Test
public void testAggsSum() throws IOException 
  SearchRequest searchRequest = new SearchRequest("fruit");
  SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  sourceBuilder.aggregation(AggregationBuilders.sum("sum_price").field("price"));
  searchRequest.source(sourceBuilder);
  SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  ParsedSum parsedSum = searchResponse.getAggregations().get("sum_price");
  System.out.println(parsedSum.getValue());


集群

ES集群类似Redis的分片集群加主从集群架构

集群 Cluster

相关概念

集群

一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是elasticsearch。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

节点

一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的,默认情况下,这个名字是一个随机的漫威漫画角色的名字,这个名字会在启动的时候赋予节点。

索引

一组相似文档的集合

映射

用来定义索引存储文档的结构如:字段、类型等。

文档

索引中一条记录,可以被索引的最小单元

分片

Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置 到集群中的任何节点上。

复制

Index的分片中一份或多份副本。

搭建集群

集群规划

# 1.准备3个ES节点和一个kibana 节点  ES 9200 9300 
- web: 9201 tcp:9301  node-1  elasticsearch.yml   
- web: 9202 tcp:9302  node-2  elasticsearch.yml
- web: 9203 tcp:9303  node-3  elasticsearch.yml
- kibana: 5602
  • 注意
    • 所有节点集群名称必须一致 cluster.name
    • 每个节点必须有一个唯一名字 node.name
    • 开启每个节点远程连接 network.host: 0.0.0.0
    • 指定使用 IP地址进行集群节点通信 network.publish_host:
    • 修改 web 端口 tcp 端口 http.port: transport.tcp.port
    • 指定集群中所有节点通信列表 discovery.seed_hosts: node-1 node-2 node-3 相同
    • 允许集群初始化 master 节点节点数: cluster.initial_master_nodes: [“node-1”, “node-2”,“node-3”]
    • 集群最少几个节点可用 gateway.recover_after_nodes: 2
    • 开启每个节点跨域访问http.cors.enabled: true http.cors.allow-origin: “*”

配置文件

# node-1 配置文件
# 指定集群名称 3个节点必须一致
cluster.name: es-cluster
# 指定节点名称 每个节点名字唯一
node.name: node-1
# 开放远程链接
network.host: 0.0.0.0
# 指定使用发布地址进行集群间通信
network.publish_host: 192.168.124.3
# 指定 web 端口
http.port: 9201
# 指定 tcp 端口
transport.tcp.port: 9301
# 指定所有节点的 tcp 通信
discovery.seed_hosts: ["192.168.124.3:9301", "192.168.124.3:9302","192.168.124.3:9303"]
# 指定可以初始化集群的节点名称
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 集群最少几个几点可用
gateway.recover_after_nodes: 2
# 解决跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"
# node-2 配置文件
# 指定集群名称 3个节点必须一致
cluster.name: es-cluster
# 指定节点名称 每个节点名字唯一
node.name: node-2
# 开放远程链接
network.host: 0.0.0.0
# 指定使用发布地址进行集群间通信
network.publish_host: 192.168.124.3
# 指定 web 端口
http.port: 9202
# 指定 tcp 端口
transport.tcp.port: 9302
# 指定所有节点的 tcp 通信
discovery.seed_hosts: ["192.168.124.3:9301", "192.168.124.3:9302","192.168.124.3:9303"]
# 指定可以初始化集群的节点名称
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 集群最少几个几点可用
gateway.recover_after_nodes: 2
# 解决跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"
# node-3 配置文件
# 指定集群名称 3个节点必须一致
cluster.name: es-cluster
# 指定节点名称 每个节点名字唯一
node.name: node-2
# 开放远程链接
network.host: 0.0.0.0
# 指定使用发布地址进行集群间通信
network.publish_host: 192.168.124.3
# 指定 web 端口
http.port: 9202
# 指定 tcp 端口
transport.tcp.port: 9302
# 指定所有节点的 tcp 通信
discovery.seed_hosts: ["192.168.124.3:9301", "192.168.124.3:9302","192.168.124.3:9303"]
# 指定可以初始化集群的节点名称
cluster.initial_master_nodes: ["node-1", "node-2","node-3"]
# 集群最少几个几点可用
gateway.recover_after_nodes: 2
# 解决跨域问题
http.cors.enabled: true
http.cors.allow-origin: "*"

编写 compose 文件

version: "3.8"
networks:
  escluster:
services:
  es01:
    image: elasticsearch:7.14.0
    ports:
      - "9201:9201"
      - "9301:9301"
    networks:
      - "escluster"
    volumes:
      - ./node-1/data:/usr/share/elasticsearch/data
      - ./node-1/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./node-1/plugins/ik:/usr/share/elasticsearch/plugins/ik
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

  es02:
    image: elasticsearch:7.14.0
    ports:
      - "9202:9202"
      - "9302:9302"
    networks:
      - "escluster"
    volumes:
      - ./node-2/data:/usr/share/elasticsearch/data
      - ./node-2/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./node-2/plugins/ik:/usr/share/elasticsearch/plugins/ik
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

  es03:
    image: elasticsearch:7.14.0
    ports:
      - "9203:9203"
      - "9303:9303"
    networks:
      - "escluster"
    volumes:
      - ./node-3/data:/usr/share/elasticsearch/data
      - ./node-3/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./node-3/plugins/ik:/usr/share/elasticsearch/plugins/ik
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

  kibana:
    image: kibana:7.14.0
    ports:
      - "5602:5601"
    networks:
      - "escluster"
    volumes:
      - ./kibana.yml:/usr/share/kibana/config/kibana.yml

kibana 配置文件

# kibana配置文件 连接到ES
server.host: "0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://192.168.124.3:9201" ] #链接任意节点即可
monitoring.ui.container.elasticsearch.enabled: true

查看集群状态

http://10.102.115.3:9200/_cat/health?v

安装head插件

1. 访问github网站
	搜索: elasticsearch-head 插件
	
2. 安装git
	yum install git
	
3. 将elasticsearch-head下载到本地
	git clone git://github.com/mobz/elasticsearch-head.git

4. 安装nodejs
	#注意: 没有wget的请先安装yum install -y wget
	wget http://cdn.npm.taobao.org/dist/node/latest-v8.x/node-v8.1.2-linux-x64.tar.xz

5. 解压缩nodejs
	xz -d node-v10.15.3-linux-arm64.tar.xz
	tar -xvf node-v10.15.3-linux-arm64.tar

6. 配置环境变量
	mv node-v10.15.3-linux-arm64 nodejs
	mv nodejs /usr/nodejs
	vim /etc/profile
		export NODE_HOME=/usr/nodejs
		export PATH=$wPATH:$JAVA_HOME/bin:$NODE_HOME/bin

7.	进入elasticsearch-head的目录
	npm config set registry https://registry.npm.taobao.org
	npm install
	npm run start


8.  启动访问head插件 默认端口9100
	http://ip:9100  查看集群状态

好玩的es--第四篇之聚合查询和集群(代码片段)

好玩的ES--第四篇之聚合查询和集群聚合查询简介测试数据使用根据某个字段分组求最大值求最小值求平均值求和整合应用集群集群Cluster相关概念集群<cluster>节点<node>索引<Index>映射<Mapping>文档<Document>分片&l... 查看详情

混合编程jni第四篇之引用和异常(代码片段)

继续写JNI的知识点上篇基本上介绍了数据的转换以及方法签名的相关知识点,不懂的可以看看之前的文章建议循序渐进,不可冒进今天继续介绍JNI的知识点 除八种基本数据类型之外的都是引用数据类型;关于引用Java虚拟... 查看详情

混合编程jni第四篇之引用和异常

系列目录:【混合编程Jni】系列目录_香菜聊游戏的博客-CSDN博客继续写JNI的知识点上篇基本上介绍了数据的转换以及方法签名的相关知识点,不懂的可以看看之前的文章建议循序渐进,不可冒进今天继续介绍JNI的知识点 除八... 查看详情

好玩的es--第三篇之过滤查询,整合springboot

好玩的ES--第三篇之过滤查询,整合SpringBoot过滤查询过滤查询使用类型term、termsFilterranagefilterexistsfilteridsfilter整合应用引入依赖配置客户端客户端对象ElasticsearchOperations索引文档删除文档查询文档更新文档删除所有查询所有Res... 查看详情

高级程序员必须精通的redis,第四篇之——set(集合)(代码片段)

1、简介Redis中所有的的数据结构都是通过一个唯一的字符串key来获取相应的value数据。Redis有5种基础数据结构,分别是:string(字符串)list(列表)hash(字典)set(集合)zset(有序集合... 查看详情

linux从青铜到王者第二十四篇:linux网络基础第四篇之websocket协议(代码片段)

系列文章目录文章目录系列文章目录前言一、WebSocket简介二、WebSocket产生背景三、WebSocket实现原理四、WebSocket协议举例五、WebSocket使用1.WebSocket介绍2.WebSocketAPI3.WebSocket事件1.open2.Message3.Error4.Close4.WebSocket方法1.send()2.close()5.WebSocket... 查看详情

flink第四篇之flink的datastreamapi(算子解析)

参考技术A以上为Flink的运行模型,Flink的程序主要由三部分构成,分别为Source、Transformation、Sink。DataSource主要负责数据的读取,Transformation主要负责对属于的转换操作,Sink负责最终数据的输出。每个Flink程序都包含以下的若干流... 查看详情

第四篇(续):熔断监控hystrixdashboard和熔断聚合监控hystrixturbine(代码片段)

一.熔断监控HystrixDashboard1.HystrixDashboard介绍 在微服务架构中为例保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型。断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标。HystrixDashboard是作为... 查看详情

dwr第四篇之对象传参

1.本示例在第一篇架构基础上添加代码2. 首先,在dwr.xml文件里添加对象转换器3. 编写Person实体类1packagecom.skyer.vo;23importjava.util.Arrays;45publicclassPerson{6privateStringname;7privateintage;8privateString[]hobby;910publicStr 查看详情

第四篇:断路器(hystrix)(代码片段)

一、断路器简介。在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在SpringCloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身... 查看详情

es学习第九课,聚合查询和复合查询(代码片段)

...实现前几课的基本查询,也可以实现类似关系型数据库的聚合查询,如平均值sum、最小值min、最大值max等等我们就用上一课的数据作为参考来举例聚合查询sum聚合sum是一个求累加值的聚合,其作用与关系型数据库中相同。GET/lib4/... 查看详情

quarkus数据库篇之四:本地缓存(代码片段)

...om/zq2599/blog_demos本篇概览本文是《quarkus数据库篇》系列的第四篇,来实战一个非常有用的知识点:本地缓存本地缓存可以省去远程查询数据库的操作,这就让查询性能有了显著提升,然而,对quark 查看详情

第四篇:记录相关操作(代码片段)

一介绍MySQL数据操作:DML========================================================在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括使用INSERT实现数据的插入UPDATE实现数据的更新使用DELETE实现数据的删除使用SELECT查询数据... 查看详情

es优化聚合查询之深度优先和广度优先(代码片段)

1.优化聚合查询示例假设我们现在有一些关于电影的数据集,每条数据里面会有一个数组类型的字段存储表演该电影的所有演员的名字。"actors":["FredJones","MaryJane","ElizabethWorthing"]   如果我们想要查询出演影片最多的十... 查看详情

第四篇:记录相关操作多表查询(代码片段)

http://www.cnblogs.com/linhaifeng/articles/7267596.html一介绍本节主题多表连接查询复合条件连接查询子查询准备表#建表createtabledepartment(idint,namevarchar(20));createtableemployee(idintprimarykeyauto_increment,namevarchar(20),sexenum(‘male‘,‘female‘)notnulldefault... 查看详情

es的常用查询与聚合(代码片段)

原文地址:http://blog.51cto.com/xpleaf/23075720说明基于es5.4和es5.6,列举的是个人工作中经常用到的查询(只是工作中使用的是JavaAPI),如果需要看完整的,可以参考官方相关文档https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search.html... 查看详情

es聚合分析(聚合分析简介指标聚合桶聚合)(代码片段)

一、聚合分析简介1.ES聚合分析是什么?聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。ES作为搜索引擎兼数据... 查看详情

efk教程-es集群开启用户认证(代码片段)

...同的磁盘上,实现了数据冷热分离、资源合理分配。?在第四篇《EFK教程(4)-ElasticSearch集群TLS加密通讯》中,阐述了ES集群创建CA、CERT证书,实现ElasticSearch集群之间数据通过TLS进行双向加密交互。本文:?ES集群开启 查看详情