Elasticsearch集群搭建学习

news2024/9/20 10:47:11

Elasticsearch集群聚合、集群搭建

    • RestClient
      • 查询所有
      • 高亮
      • 算分控制
    • 数据聚合
      • DSL实现Bucket聚合
      • DSL实现Metrics聚合
      • RestAPI实现聚合
    • 拼音分词器
      • 如何使用拼音分词器?
      • 如何自定义分词器?
      • 拼音分词器注意事项?
    • 自动补全
    • 数据同步
    • 集群搭建
      • ES集群结构
      • 创建es集群
      • 集群状态监控
      • 创建索引库
        • 1)利用kibana的DevTools创建索引库
        • 2)利用cerebro创建索引库
      • 查看分片效果
      • ES集群中的节点角色
      • ES脑裂
      • ES集群的分布式存储
      • ES集群的分布式查询
      • ES集群的故障转移

RestClient

查询所有

void testMatchAll() throws IOException {
        //1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = restClient.search(requ est , RequestOptions.DEFAULT);

        System.out.println(response);
    }

高亮

高亮API包括请求DSL构建和结果解析两部分。

构建:

request.source().highlighter(new HghlightBuilder().field("name")
                             //是否需要与字段匹配
                             .requireFieldMatch(false))
@Test
    public void testHighLight() throws IOException {
        //1 准备Request
        SearchRequest request = new SearchRequest("hotel");
        //2 准备DSL
        request.source().query(QueryBuilders.matchQuery("name" , "如家"));
        //2.2 高亮
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        //3 发送请求
        SearchResponse response = restClient.search(request , RequestOptions.DEFAULT);
        //4 解析响应
        SearchHits searchHits = response.getHits();
        //5 获取总条数
        long total = searchHits.getTotalHits().value;
        //4.2 文档数组
        SearchHit[] hits = searchHits.getHits();
        //4.3 遍历
        for(SearchHit hit : hits){
            //获取文档source
            String json = hit.getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json , HotelDoc.class);
            //获取高亮结果
            Map<String , HighlightField> highlightFields = hit.getHighlightFields();
            //根据字段名获取高亮结果
            HighlightField highlightField = hightlightFields.get("name");
            //获取高亮值
            String name = highlightField.getFragments()[0].string();
            //覆盖非高亮结果
            hotelDoc.setName(name);
        }
    }
  • 所有搜索DSL的构建,记住一个API:

    • SearchRequest的source()方法。
  • 高亮结果解析是参考JSON结果,逐层解析

算分控制

FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
	//原始查询,相关性算分的查询
    boolQuery ,
    new FunctionSocreQueryBuilder.FilterFunctionBuilder[]{
        new FunctionScoreQueryBuilder.FilterFunctionBuilder(
        	//过滤条件
            QueryBuilders.termQuery("isAd" , true),
            //算分函数
            ScoreFuntionBuilders.weightFactorFuntion(10)
            
        )
    }
);

数据聚合

聚合的分类

聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类:

  • 桶(Bucket)聚合:用来对文档做分组

    • TermAggregation:按照文档字段值分组
    • Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组
  • 度量(Metric)聚合:用以计算一些值,比如:最大值、最小值、平均值等

    • Avg:求平均值
    • Max:求最大值
    • Min:求最小值
    • Stats:同时求max、min、avg、sum等
  • 管道(pipeline)聚合:其他聚合的结果为基础做聚合

什么是聚合?

  • 聚合是对文档数据的统计、分析、计算

聚合的常见种类有哪些?

  • Bucket:对文档数据分组,并统计每组数量
  • Metric:对文档数据做计算,例如avg
  • Pipeline:基于其他聚合结果再做聚合

参与聚合的字段类型必须是:

  • keyword
  • 数值
  • 日期
  • 布尔

DSL实现Bucket聚合

GET /hotel/_search
{
    "size":0, // 设置size为0,结果中不包含文档,只包含聚合结果
    "aggs":{ // 定义聚合
        "brandAgg":{ // 给聚合起个名字
            "terms":{ // 聚合的类型,按照品牌值聚合,所以选择term
                "field":"brand", // 参与聚合的字段
                "size":20 // 希望获取的聚合结果数量
            }
        }
    }
}

aggs代表聚合,与query同级,此时query的作用是?

  • 限定聚合的文档范围

聚合必须的三要素:

  • 聚合名称
  • 聚合类型
  • 聚合手段

聚合可配置属性有:

  • size:指定聚合结果数量
  • order:指定聚合结果排序方式
  • field:指定聚合字段

DSL实现Metrics聚合

例如,我们要求获取每个品牌的用户评分的min、max、avg等值

GET /hotel/_search
{
 	"size":0,
    "aggs":{
    	"brandAgg":{
    		"terms":{
    			"field":"brand",
    			"size":20
    		},
    		"aggs":{// 是brands聚合的子聚合,也就是分组后对每组分别计算
    			"score_status":{ // 聚合名称
    				"stats":{ // 聚合类型,这里stats可以计算min、max、avg等
    					"field":"score"// 聚合字段,这里可以是score
    				}
    			}
    		}
    	}
    }
}

RestAPI实现聚合

@Test
    public void testAggregation() throws IOException {
        // 准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 准备DSL
        // 设置size
        request.source().size(0);
        // 聚合
        request.source().aggregation(AggregationBuilders.terms("brandAgg").size(20).field("brand"));
        //发出请求
        SearchResponse response = restClient.search(request, RequestOptions.DEFAULT);
        //解析聚合结果
        Aggregations aggregations = response.getAggregations();
        //根据名称获取聚合结果
        Terms brandTerms = aggregations.get("brand_agg");
        //获取桶
        List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
        for (Terms.Bucket bucket : buckets) {
            //获取key,也就是品牌信息
            String brandName = bucket.getKeyAsString();
            System.out.println(brandName);
        }
    }

实现对品牌、城市、星级的聚合

@Test
    public Map<String , List<String>> testMap() throws IOException {
        // 准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 准备DSL
        // 设置size
        request.source().size(0);
        // 聚合
        request.source().aggregation(AggregationBuilders.terms("brandAgg").size(20).field("brand"));
        request.source().aggregation(AggregationBuilders.terms("cityAgg").size(20).field("city"));
        request.source().aggregation(AggregationBuilders.terms("starAgg").size(20).field("starName"));
        //发出请求
        SearchResponse response = restClient.search(request, RequestOptions.DEFAULT);
        //解析聚合结果
        Aggregations aggregations = response.getAggregations();
        Map<String , List<String>> result = new HashMap<>();
        result.put("brandAgg" , getAggByName("brandAgg" , aggregations));
        result.put("cityAgg" , getAggByName("cityAgg" , aggregations));
        result.put("starAgg" , getAggByName("starAgg" , aggregations));
        return result;
    }

    private List<String> getAggByName(String name , Aggregations aggregations){
        List<String> result = new ArrayList<>();
        Terms terms = aggregations.get(name);
        for (Terms.Bucket bucket : terms.getBuckets()) {
            String keyAsString = bucket.getKeyAsString();
            result.add(keyAsString);
        }
        return result;
    }

拼音分词器

如何使用拼音分词器?

下载pinyin分词器

解压并放到elasticsearch的plugin目录

重启

如何自定义分词器?

创建索引库时,在settings中配置,可以包含三部分

character filter

tokenizer

filter

拼音分词器注意事项?

为了避免搜索到同音字,搜索时不要使用拼音分词器

自动补全

elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:

  • 参与补全查询的字段必须是completion类型
  • 字段的内容一般是用来补全的多个词条形成的数组
// 自动补全查询
GET /test2/_search
{
  "suggest":{
    "titleSuggest":{
      "text":"s",
      "completion":{
        "field":"title",
        "skip_duplicates":true,
        "size":10
      }
    }
  }
}

自动补全对字段的要求:

  • 类型是completion类型
  • 字段值是多词条的数组
@Test
public void testSuggest() throws IOException {
    // 准备Request
    SearchRequest request = new SearchRequest("hotel");
    // 准备DSL
    request.source().suggest(new SuggestBuilder().addSuggestion(
        "suggestions" , SuggestBuilders.completionSuggestion("suggestion")
    	.prefix("h")
    	.skipDuplicates(true)
    	.size(10)));
    // 发起请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);
    // 解析结果
    Suggest suggest = response.getSuggest();
    // 根据名称获取补全结果
    CompletionSuggestion suggestion = suggest.getSuggestion("hotelSuggestion");
    //获取options并遍历
    for(CompletionSuggestion.Entry.Option option : suggestion.getOptions()){
        String text = option.getText().string();
        System.out.println(text);
    }
}

数据同步

  • 同步调用
    • 优点:实现简单,粗暴
    • 缺点:业务耦合度高
  • 异步通知
    • 优点:低耦合,实现难度一般
    • 缺点:依赖mq的可靠性
  • 监听binlog
    • 优点:完全解除服务间耦合
    • 缺点:开启binlog增加数据库负担、实现复杂度高

异步通知数据同步步骤:

  1. 定义config文件,声明队列和交换机bean,并绑定队列与交换机
  2. 在增加删除修改接口中发送mq消息到指定的增删改队列
  3. 定义监听器,监听mq消息并修改es文档

集群搭建

ES集群结构

单机的es做数据存储,必然面临两个问题:海量数据存储问题,单点故障问题

  • 海量数据存储问题:将索引库从逻辑上拆分N个分片(shard),存储到多个节点
  • 单点故障问题:将分片数据在不同节点备份(replica)

创建es集群

首先编写一个docker-compose.yml文件,内容如下:

version: '2.2'
services:
  es01:
    image: elasticsearch:7.12.1
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: elasticsearch:7.12.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data02:/usr/share/elasticsearch/data
    ports:
      - 9201:9200
    networks:
      - elastic
  es03:
    image: elasticsearch:7.12.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic
    ports:
      - 9202:9200
volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge

es运行需要修改一些linux系统权限,修改/etc/sysctl.conf文件

vi /etc/sysctl.conf

添加下面的内容:

vm.max_map_count=262144

然后执行命令,让配置生效:

sysctl -p

通过docker-compose启动集群:

docker-compose up -d

集群状态监控

kibana可以监控es集群,不过新版本需要依赖es的x-pack 功能,配置比较复杂。

这里推荐使用cerebro来监控es集群状态,官方网址:https://github.com/lmenezes/cerebro

双击的cerebro.bat文件即可启动服务。

访问http://localhost:9000 即可进入管理界面:

在这里插入图片描述

输入你的elasticsearch的任意节点的地址和端口,点击connect即可:

在这里插入图片描述

绿色的条,代表集群处于绿色(健康状态)。

创建索引库

1)利用kibana的DevTools创建索引库

在DevTools中输入指令:

PUT /itcast
{
  "settings": {
    "number_of_shards": 3, // 分片数量
    "number_of_replicas": 1 // 副本数量
  },
  "mappings": {
    "properties": {
      // mapping映射定义 ...
    }
  }
}
2)利用cerebro创建索引库

利用cerebro还可以创建索引库:

在这里插入图片描述

填写索引库信息:

在这里插入图片描述

点击右下角的create按钮:

在这里插入图片描述

查看分片效果

回到首页,即可查看索引库分片效果:

在这里插入图片描述

ES集群中的节点角色

elasticsearch中集群节点有不同的职责划分:

在这里插入图片描述

ES脑裂

默认情况下,每个节点都是master eligible节点,因此一旦master节点宕机,其他候选节点会选举一个称为主节点。当主节点与其他节点网络故障时,可能发生脑裂问题。

为了避免脑裂,需要要求选票超过(eligible节点数量+1)/2才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimux_master_nodes,在es7.0以后,已经成为默认配置,因此一般不会发生脑裂问题。

  • master eligible结点的作用?
    • 参与集群选主
    • 主节点可以管理集群状态、管理分片信息、处理创建和删除索引库的请求
  • data结点的作用?
    • 数据的CRUD
  • coordinator结点的作用?
    • 路由请求到其他节点
    • 合并查询到的结果,返回给用户

ES集群的分布式存储

当新增文档时,应该保存到不同的分片,保证数据均衡,那么coordinating node如何确定数据该存储到哪个分片呢?elasticsearch会通过hash算法来计算文档应该存储到哪个分片:

shard = hash(_routing) % number_of_shards

说明:

  • _routing默认是文档的id
  • 算法与分片数量有关,因此索引库一旦创建,分片数量不能修改!

ES集群的分布式查询

elasticsearch的查询分为两个阶段:

  • scatter phase:分散阶段,coordinating node会把请求分发到每一个分片
  • gather phase:聚集阶段,coordinating node汇总data node的搜索结果,并处理为最终结果集返回给用户

ES集群的故障转移

集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其他节点,确保数据安全,这个叫做故障转移

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++—— set、map、multiset、multimap的介绍及使用

目录 关联式容器 关联式容器的特点和使用场景 树形结构与哈希结构 树形结构 哈希结构 键值对 set set的介绍 set的定义方式 set的使用 multiset map map的介绍 map的定义方式 map的使用 multimap 关联式容器 C标准模板库&#xff08;STL&#xff09;中的关联…

vue17:v-bind对css样式的控制增强

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><styl…

软考之零碎片段记录(三十一)+复习巩固(错题整理,知识点总结,易错题)

1. 奇偶校验 只能检测一位数的错误。但无法纠正错误。若有奇数个数据位出错&#xff0c;可检测。有局限性。 2. 深度与广度优先遍历 参考题【【数据结构自用】1.图深度优先遍历2.找有向图中的强连通分量数目3.给出图的任意两个拓扑序列】https://www.bilibili.com/video/BV…

下雨!大水蚁引发的水文!看比赛咯,曼联VS曼城——早读(逆天打工人爬取热门微信文章解读)

唠唠嗑 水一水 引言Python 代码结尾 引言 今天星期六 大小周 一个等了很久的双休 昨天晚上真的是吓到我了 漫天的小飞虫 我一开始还以为是一两只 没想到那些小飞虫 从阳台不断飞进来 在山卡拉下面租房子 也是太恐怖了 来个特写 他们也就一个晚上的时间 成虫 天气合适 长翅…

Unity-Sprite Atlas+UGUI系统的运行原理

每日一句&#xff1a;别听世俗耳语&#xff0c;看自己的风景就好 目录 SA的原理&#xff1a; SA的优点&#xff1a; SA的缺点&#xff1a; DrawCall是什么&#xff1f; 批处理是什么&#xff1f; 我们先了解一下UGUI系统的运行原理吧&#xff01; 提到图集优化&#xff0…

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现

【面试干货】数据库乐观锁&#xff0c;悲观锁的区别&#xff0c;怎么实现 1、乐观锁&#xff0c;悲观锁的区别2、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、乐观锁&#xff0c;悲观锁的区别 悲观锁&#xff08;Pessimistic Lo…

会声会影调速怎么用 会声会影如何调整音频速度

会声会影是一款功能强大的视频编辑软件&#xff0c;可以帮助我们轻松的实现剪辑。 会声会影的操作简单易懂&#xff0c;界面简洁明快。适合家庭使用&#xff0c; 我们使用会声会影可以在家就能将视频剪辑成好莱坞大片。但是在使用的过程中&#xff0c;仍然会遇到一些操作上的问…

mac下安装airflow

背景&#xff1a;因为用的是Mac的M芯片的电脑&#xff0c;安装很多东西都经常报错&#xff0c;最近在研究怎么把大数据集群上的crontab下的任务都配置到一个可视化工具中&#xff0c;发现airflow好像是个不错的选择&#xff0c;然后就研究怎么先安装使用起来&#xff0c;后面再…

「React」useEffect 与 useLayoutEffect 使用与区别

前言 useEffect 与 useLayoutEffect 是两个 Hooks&#xff0c;前者比较常用&#xff0c;后者在一些场景下也会用到&#xff0c;下面说明两者区别和应用场景。 使用 useEffect 和 useLayoutEffect 是React Hooks里用于处理副作用的钩子&#xff08;Hooks&#xff09;&#x…

单机一天轻松300+ 最新微信小程序拼多多+京东全自动掘金项目、

现代互联网经济的发展带来了新型的盈利方式&#xff0c;这种方法通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;以此给商家带来增加的流量&#xff0c;同时为使用者带来利润。实践这一手段无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被…

自定义一个SpringBoot场景启动器

前言 一个刚刚看完SpringBoot自动装配原理的萌新依据自己的理解写下的文章&#xff0c;如有大神发现错误&#xff0c;敬请斧正&#xff0c;不胜感激。 分析SpringBoot自动配置原理 SpringBoot的启动从被SpringBootApplication修饰的启动类开始,SpringBootApplicaiotn注解中最…

单片机LCD1602显示电子时钟设计

基于52单片机电子时钟的设计 摘要 本次设计的多功能时钟系统采用STC89C52单片机为核心器件&#xff0c;利用其定时器/计数器定时和记数的原理&#xff0c;结合液晶显示电路、时钟芯片DS1302电路、电源电路以及按键电路来设计计时器。将软硬件有机地结合起来&#xff0c;使得系…

十一、Python循环语句「长期更新Python简单入门到适用」

在python中&#xff0c;它的循环语句有 for 与 while 1、while循环 在python 中 while 语句的一般形式&#xff1a; while 判断条件 : 声明 同样需要注意冒号和缩进。另外&#xff0c;在Python中没有 do..while 循环。 以下实例使用了 while 来计算 1 到 50 的总和&#…

Adobe Camera Raw 11 for Mac/win:摄影后期处理的革命性飞跃

在数字摄影的世界里&#xff0c;RAW格式以其未压缩的原始数据特性&#xff0c;为摄影师提供了更大的后期处理空间。而Adobe Camera Raw 11&#xff0c;作为这一领域的翘楚&#xff0c;以其卓越的性能和创新的功能&#xff0c;为摄影师们带来了前所未有的创作体验。 Adobe Came…

全网最全网络基础思维导图合集(38张)

计算机网络基础知识点多且杂&#xff0c;想要系统地学习&#xff0c;思维导图肯定是必不可少的。 今天整理了38张思维导图&#xff0c;帮助你轻松理清思路&#xff0c;快速掌握关键内容。建议你收藏起来慢慢看&#xff0c;在看过之后最好能重新动手画一画&#xff0c;让计算机…

如何使用DotNet-MetaData识别.NET恶意软件源码文件元数据

关于DotNet-MetaData DotNet-MetaData是一款针对.NET恶意软件的安全分析工具&#xff0c;该工具专为蓝队研究人员设计&#xff0c;可以帮助广大研究人员轻松识别.NET恶意软件二进制源代码文件中的元数据。 工具架构 当前版本的DotNet-MetaData主要由以下两个部分组成&#xf…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

C#解析JSON的常用库--Newtonsoft.Json

一、库介绍 在C#中&#xff0c;解析JSON的常用库有Newtonsoft.Json&#xff08;也称为Json.NET&#xff09;和 System.Text.Json&#xff08;从 .NET Core 3.0 开始引入&#xff09;。本文主要介绍 Newtonsoft.Json。 二、下载 官网&#xff1a; https://www.nuget.org/pack…

C语言之指针进阶(3),函数指针

目录 前言&#xff1a; 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结&#xff1a; 前言&#xff1a; 本文主要讲述C语言指针中的函数指针&#xff0c;包括函数指针变量的概念、创建…

简易进程池的实现

什么是进程池&#xff1f; 进程池&#xff08;Process Pool&#xff09;是一种用于管理和复用多个进程的技术或设计模式。在进程池中&#xff0c;一定数量的进程会被预先创建并保持在内存中&#xff0c;以便在需要时立即使用&#xff0c;而不是每次需要进程时都重新创建新的进程…