Elasticsearch集群搭建学习

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.准备RequestSearchRequest request = new SearchRequest("hotel");//2.准备DSLrequest.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))
@Testpublic void testHighLight() throws IOException {//1 准备RequestSearchRequest request = new SearchRequest("hotel");//2 准备DSLrequest.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){//获取文档sourceString 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实现聚合

@Testpublic void testAggregation() throws IOException {// 准备RequestSearchRequest request = new SearchRequest("hotel");// 准备DSL// 设置sizerequest.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);}}

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

@Testpublic Map<String , List<String>> testMap() throws IOException {// 准备RequestSearchRequest request = new SearchRequest("hotel");// 准备DSL// 设置sizerequest.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 {// 准备RequestSearchRequest request = new SearchRequest("hotel");// 准备DSLrequest.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.1container_name: es01environment:- 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/dataports:- 9200:9200networks:- elastices02:image: elasticsearch:7.12.1container_name: es02environment:- 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/dataports:- 9201:9200networks:- elastices03:image: elasticsearch:7.12.1container_name: es03environment:- 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/datanetworks:- elasticports:- 9202:9200
volumes:data01:driver: localdata02:driver: localdata03:driver: localnetworks: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.rhkb.cn/news/331257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS鸿蒙应用开发——ArkTS的“内置组件 + 样式 + 循环和条件渲染”

一、内置组件是咩&#xff1f; 学过前端的都知道&#xff0c;一个组件就是由多个组件组成的&#xff0c;一个组件也可以是多个小组件组成的&#xff0c;组件就是一些什么导航栏、底部、按钮......啥的&#xff0c;但是组件分为【自定义组件】跟【内置组件】 【自定义组件】就…

java继承使用细节二

构造器 主类是无参构造器时会默认调用 public graduate() {// TODO Auto-generated constructor stub也就是说我这里要用构造器会直接调用父类。它是默认看不到的 &#xff0c;System.out.println("graduate");} 但当主类是有参构造器如 public father_(int s,doubl…

K8S集群中Yaml文件详解

目录 一、Yaml概述 二、Yaml基本语法 三、Yaml数据结构 四、K8S资源清单描述方法 五、api资源版本标签 六、Yaml文件示例详解 1.deployment.yaml文件详解 2.Pod yaml文件详解 3.Service yaml文件详解 七、Yaml文件相关操作 1.试运行 2.生成yaml格式 3.生成json格式…

超大Sql文件切分工具SQLDumpSplitter —— 筑梦之路

官网&#xff1a;PLB PLB - SQLSplitter 用于将大型MySQL转储拆分为可独立执行的小型SQL文件。 显示100%时并不是已经处理完了&#xff0c;而是才开始 优点 软件程序小巧&#xff0c;不需要安装&#xff0c;直接点击运行就可以最厉害的是SQLDumpSplitter可以自动将结构语句&…

JVM学习-执行引擎

执行引擎 执行引擎是Java虚拟机核心组成部分之一虚拟机是一个相对于物理机的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引擎是由软件自行实现的&#xf…

近临算法(个人总结版)

背景 近邻算法&#xff08;Nearest Neighbor Algorithm&#xff09;是一种基本但非常有效的分类和回归方法。最早由Fix和Hodges在1951年提出&#xff0c;经过几十年的发展和改进&#xff0c;已成为数据挖掘、模式识别和机器学习领域的重要工具。近邻算法基于相似性原则&#x…

vue源码2

vue之mustache库的机理其实是将模板字符串转化为tokens 然后再将 tokens 转化为 dom字符串&#xff0c;如下图 对于一般的将模板字符串转化为dom字符串&#xff0c;这样不能实现复杂的功能 let data {name:小王,age:18 } let templateStr <h1>我叫{{name}},我今年{{ag…

git分支常用命令

最近在用git提交代码的时候&#xff0c;发现有些命令不是很会&#xff0c;先记录几个常用分支命令&#xff0c;后续再补充&#xff0c;在执行git push命令提交代码的时候遇到报错&#xff0c;一并记录下。 1.git常用命令 新建分支&#xff1a; git branch <分支名称> 比…

2025第十届美陈展

展位又遭疯抢&#xff01;2025第十届美陈展释放“无界之美” 美是全球通用的语言&#xff0c;人类对美的追求始终如一&#xff0c;大众审美在经历了时代的变迁后开始趋同&#xff0c;东方文明深处的美学经济开始崛起。 在如今商业迈入存量阶段&#xff0c;以品牌为突破口打造…

Ai自动贴图直播项目的趋势,智享自动直播GMV增加工具

在当今社会&#xff0c;直播行业正在悄然地改变着人们的生活方式。无论是在闲暇时光中放松身心&#xff0c;还是在临睡前享受休闲娱乐&#xff0c;观众们越来越习惯于通过刷短视频或者观看直播来消遣自己。根据统计数据显示&#xff0c;到2023年全球将有超过10.74亿网民&#x…

前端日志收集(monitor-report v1)

为什么 为什么自己封装而不是使用三方 类似 Sentry 这种比较全面的 因为 Sentry 很大我没安装成功&#xff0c;所有才自己去封装的 为什么使用 可以帮助你简单解决前端收集错误日志、收集当前页面访问量&#xff0c;网站日活跃&#xff0c;页面访问次数&#xff0c;用户行…

海外仓储管理系统:提升效率,标准化海外仓管理,科技赋能业务

海外仓作为跨境物流的关键一环&#xff0c;完全可以说海外仓的效率直接决定了后续物流的整体运作效率。 对于海外仓而言&#xff0c;一套高效&#xff0c;易用的海外仓储系统&#xff0c;无疑将成为提升企业竞争力的重要工具&#xff0c;帮助海外仓实现从野蛮生长到标准化管理…

pytorch-13_2 模型结构选择策略:层数、激活函数、神经元个数

一、拟合度概念 在所有的模型优化问题中&#xff0c;最基础的也是最核心的问题&#xff0c;就是关于模型拟合程度的探讨与优化。根据此前的讨论&#xff0c;模型如果能很好的捕捉总体规律&#xff0c;就能够有较好的未知数据的预测效果。但限制模型捕捉总体规律的原因主要有两点…

02_前端三大件HTML

文章目录 HTML用于网页结构搭建1. 标签2. 客户端服务器交互流程3. 专业词汇4. html语法细节5. 安装VSCODE安装插件6. Live Server插件使用7. 标题&段落&换行&列表8. 超链接标签使用9. 图片10. 表格的写法11. 表单标签*(重点)12. 下拉框13. 页面布局标签14. 块元素和…

java —— 封装、继承、接口和多态

一、封装 封装是将数据和操作这些数据的方法整合成一个类。在这个类中&#xff0c;用 private 修饰符将某些数据隐藏起来&#xff0c;只通过特定的方法实现这些数据的访问和修改&#xff0c;以此实现数据的完整和安全性。 封装的步骤&#xff1a; 二、继承 继承是指把子类共有…

韵搜坊 -- Elastic Stack快速入门

文章目录 现有问题Elastic Stack介绍&#xff08;一套技术栈&#xff09;安装ES安装KibanaElasticsearch概念倒排索引Mapping分词器IK分词器&#xff08;ES插件&#xff09;打分机制 ES的几种调用方式restful api调用&#xff08;http 请求&#xff09;kibana devtools客户端调…

Creating Server TCP listening socket *:6379: listen: Unknown error

错误&#xff1a; 解决方法&#xff1a; 在redis安装路径中打开cmd命令行窗口&#xff0c;输入 E:\Redis-x64-3.2.100>redis-server ./redis.windows.conf结果&#xff1a;

Jenkins 构建 Web 项目:构建服务器和部署服务器分离的情况

构建命令 #!/bin/bash node -v pnpm -v pnpm install pnpm build:prod # 将dist打包成dist.zip zip -r dist.zip dist

微软密谋超级AI大模型!LangChain带你轻松玩转大模型开发

此前&#xff0c;据相关媒体报道&#xff0c;微软正在研发一款名为MAI-1的最新AI大模型&#xff0c;其参数规模或将达5000亿以上&#xff0c;远超此前微软推出的相关开源模型&#xff0c;其性能或能与谷歌的Gemini 1.5、Anthropic的Claude 3和OpenAI的GPT-4等知名大模型相匹敌。…

Android 自定义图片进度条

用系统的Progressbar&#xff0c;设置图片drawable作为进度条会出现图片长度不好控制&#xff0c;容易被截断&#xff0c;或者变形的问题。而我有个需求&#xff0c;使用图片背景&#xff0c;和图片进度&#xff0c;而且在进度条头部有个闪光点效果。 如下图&#xff1a; 找了…