Elasticsearch简述
Elasticsearch简述
Elasticsearch产品介绍
Elasticsearch是一个基于Apache Lucene的开源的分布式搜索和分析引擎,设计用于云计算中,能够快速处理大量数据。它能够近实时地进行复杂的查询,并且可以用于全文检索、结构化搜索以及分析。Elasticsearch具有以下特性:
- 分布式搜索引擎,可以扩展到上百台服务器,处理PB级的数据。
- RESTFUL API,使用JSON进行数据交换。
- 实时分析,可以对数据进行实时分析。
- 高可用性,节点失败时可以自动重分配。
- 近实时,数据被索引后立即可以被搜索。
- 支持各种编程语言。
一、安装运行
-
安装:参照https://www.elastic.co/cn/downloads/elasticsearch,本文版本6.4.3
-
运行:运行bin/elasticsearch,然后就可以访问http://localhost:9200
-
elasticsearch.yml关键配置说明
# 集群名称,判断是否是同一个集群
cluster.name: elasticsearch
# 节点名称,判断是否是集群中的不同节点
#node.name: node-1
# 网络地址和端口,用于http和transport服务使用
network.host: 127.0.0.1
http.port: 9200
# 数据存储地址
#path.data: /path/to/data
# 日志存储地址
#path.logs: /path/to/logs
- Development与Production模式说明
- 以transport的地址是否绑定在localhost为标准判断network.host;
- Development模式下启动时会以warning的方式提示配置检查异常;
- Production模式下启动时会以error的方式提示配置检查异常并退出;
- 参数修改的第二种方式: bin/elasticsearch -E http.port=19200。
- 倒排索引
- 倒排索引是通过分词策略,形成词和文章的映射关系表,这种词典+映射表即为倒排索引。传统的检索是通过文章逐个找到对应关键词的位置。
二、多节点集群
- Elasticsearch本地启动集群的方式
bin/elasticsearch
bin/elasticsearch –E http.port=8200 –E path.data=node2
bin/elasticsearch –E http.port=7200 –E path.data=node3
-
查看集群的详细情况:http://localhost:9200/_cluster/stats
-
查看启动情况:http://localhost:9200/_cat/nodes?v
-
查看集群状态:http://localhost:9200/_cluster/health
status字段指示当前集群在总体上是否正常工作,green表示所有主分片和副本分片都正常运行,yellow表示主分片正常运行,不是所有副本分片都正常运行,red表示有主分片没能正常运行。
- 集群相关概念
- 集群是一组有相同的cluster.name的节点。索引可以被拆分成不同的部分进行存储,称为分片,一个索引的不同分片可以部署到不同的节点,这样可以解决数据量太大,单点存储量有限的问题。每个主分片可以有一个或多个副本分片,可以保证高可用。
- 数据写入流程
- 新建、索引和删除请求都是写操作,必须在主分片上完成后才能被复制到相关的副本分片。客户端请求任意的集群节点(协调节点),协调节点将请求转发到指定的节点,主分片需要将数据保存并发送到副本,副本保存后进行反馈,主分片反馈给客户端,客户端获取反馈。
- 数据读取流程
- 客户端发送查询请求到协调节点,协调节点计算数据所在的分片以及全部的副本位置,为了能够负载均衡,轮询所有节点,将请求发送给具体的节点,节点返回查询结果并反馈给客户端。
- master选举流程
- Elasticsearch的选举流程是由ZenDiscovery模块负责的,主要包含Ping和Unicast单播模块。对所有可以成为master的节点根据nodeId字典排序,每次选举每个节点都把自己所知道的节点排序,然后选出第一个节点暂时认为它是master节点。如果对某个节点的投票数达到一定的值并且该节点自己也选举自己,这个节点就是master。master节点负责集群、节点和索引的管理,不负责文档级别的管理,data节点可以关闭http功能。
- 路由计算
- 通过公式
shard=hash(routing)%number_of_primary_shards
决定文档应该放到哪个分片,routing默认是文档的_id,也可以是自定义的值,通过hash函数获取一个数字,然后获取与主分片数量的余数可以得到文档所在分片的位置。 - 我们可以把请求发送到集群中的任意一个节点,每个节点都有能力处理任意请求,每个节点都知道集群中任一文档的位置,可以直接将请求转发到需要的节点上。
三、Elasticsearch集群脑裂问题
在集群中因为主节点访问阻塞或者网络不可用导致出现分区,不同分区选举出不同的主节点的现象叫做脑裂。脑裂问题可能会导致数据丢失、不一致或者其他问题。
- 脑裂问题的原因
- 网络问题:集群之间的网络延迟导致一些节点访问不到master,认为master挂了然后重新选出了新的master,并对master上的分片和副本标红,分配新的主分片。
- 节点过载:主节点的角色既是master又是data,访问量较大时可能会导致停止响应造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉后会重新选出主节点。
- 内存回收:data节点上的elasticsearch进程占用内存较大,引发JVM的大规模内存回收,造成进程失去响应。
- 解决方案
- 角色分离:master节点与data节点分离,限制角色。
# 主节点配置
node.master: true
node.data: false
# 从节点配置
node.master: false
node.data: true
- 减少误判:discovery.zen.ping_timeout节点状态的响应时间,默认是3s,可以适当调大。如果master在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。
- 选举触发:discovery.zen.minimum_master_nodes参数用来控制选举行为发生的最小集群主节点数量。当备选主节点的个数大于等于该参数的值,并且备选主节点中有该参数个节点认为主节点挂了进行选举。
四、Elasticsearch常见操作
文档Document,索引Index,索引中的数据类型Type,文档的属性Field,查询语法Query DSL。
-
create
POST /accounts/person/1
{"name": "John","lastname": "Dow","job_description": "System administrator and Linux specialit"
}
-
read
GET /accounts/person/1
-
update
POST /accounts/persion/1/_update
{"doc": {"job_description": "System administrator and Linux specialit"}
}
-
delete
DELETE /accounts/person/1
-
query
-
查询字符串
GET /accounts/person/_search?q=john
-
DSL
GET /accounts/person/_search
{"query": {"match": {"name": "john"}}
}
五、ik分词器
- 插件安装:解压插件到elasticsearch安装路径的plugins目录。
- 创建索引库
PUT /ik
{"settings": {"number_of_shards": 5,"number_of_replicas": 1}
}
- 设置mapping
- ik_smart是粗粒度分词,ik_max_word是细粒度分词。
- type字段类型:Text数据类型用来索引长文本,建立索引前会将文本进行分词,转化为词的组合,建立索引,不能用来排序和聚合。Keyword数据类型用来建立电子邮箱地址、姓名等不需要进行分词的数据,可以用来检索过滤、排序和聚合。
PUT /ik/fulltext/_mapping
{"properties": {"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart" }}
}
- 插入数据
POST /ik/fulltext/1
{"content": "集群之间的网络延迟导致一些节点访问不到master"
}POST /ik/fulltext/2
{"content": "认为master挂了然后重新选出了新的master"
}
- 查询
POST /ik/fulltext/_search
{"query": {"match": {"content": "master"}},# 匹配到的结果会添加指定的样式"highlight": {"pre_tags": ["<font color='red'>"],"post_tags": ["</font>"],"fields": {"content": {}}}
}
六、Java API访问Elasticsearch
- 创建工程ES-PRAC,引入相关依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.zjh</groupId><artifactId>ES-PRAC</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 引入elasticsearch依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><!-- 引入jpa操作mysql --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
- 在mysql表中创建Blog表
CREATE TABLE `t_blog` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',`title` varchar(60) DEFAULT NULL COMMENT '博客标题',`author` varchar(60) DEFAULT NULL COMMENT '博客作者',`content` mediumtext COMMENT '博客内容',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间'
相关文章:

Elasticsearch简述
Elasticsearch简述 Elasticsearch产品介绍 Elasticsearch是一个基于Apache Lucene的开源的分布式搜索和分析引擎,设计用于云计算中,能够快速处理大量数据。它能够近实时地进行复杂的查询,并且可以用于全文检索、结构化搜索以及分析。Elasticsearch具有以下特性: 分布式搜索…...

SQL— DDL语句学习【后端 9】
SQL— DDL语句学习 在数据管理的广阔领域中,SQL(Structured Query Language)作为操作关系型数据库的编程语言,扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准,还为我们提供了强大的工具来管理、查…...

线程池介绍
1.线程池简介 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableDemo {public sta…...

如何备份电脑所有数据?有哪些方法值得参考借鉴?
备份电脑所有数据是防护数据丢失和泄密的重要一项措施,备份数据也有不同的方式和工具,正确的工具能帮你省时省力,下面盘点了几个方法,来看哪一种最适合你。 一、使用专业备份软件 第三方服务器文件自动备份软件:如安企…...

初识--树(1)
下面就是这篇博客要讲的内容 树 二叉树堆 树概念及结构二叉树的概念及结构二叉树的实现堆的概念及运用 这篇博客主要以二叉树为主要内容。 1、树的概念及结构 1.1树的概念: 树是一种非线性的数据结构,它是由n(n>0)个有限…...

渗透测试实战-菠菜站渗透测试(Nacos反序列化漏洞利用)
免责声明:文章来源于真实渗透测试,已获得授权,且关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本…...

Pytest框架直接右键运行 testcase.py,不执行最外层conftest
随笔记录 目录 1. 背景介绍 2. workaround method 2.1 通过命令行执行 某个测试用例 1. 背景介绍 Pytest 框架结构如下: TestCases:conftest.pyInstanta: conftest.pytest_instanta_tcpdump_pack_len.py# 当直接右键直接 运行 test_instanta_tcpdump_pack_l…...

Cxx primer-chap15-Object-Oriented Programming
面向对象编程的三个基本概念:数据抽象、继承和动态绑定(多态):基类应该提供一些类型无关的成员函数定义,将与类相关的函数留给不同的派生类定义:,派生类是通过类派生列表(class derivation list…...

当黑神话遇上AI:悟空背后的策划逆袭战
声明:此篇为 ai123.cn 原创文章,转载请标明出处链接:https://ai123.cn/2192.html 哈喽,亲爱的游戏迷,随着《黑神话:悟空》的上线,大家都在忙着“直面天命”了吧?今天我想和大家分享最…...

外呼触发通知发送闪信(mod_cti基于FreeSWITCH)
文章目录 前言联系我们手动外呼配置方法例子一:接收到180或183时触发闪信发送例子二:挂断后触发闪信发送 自动外呼配置方法例子:接收到180或183时触发闪信发送 前言 在呼叫中心中间件中,自动外呼触发闪信发送,我们可以…...

8.Java基础概念-方法
欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words! 什么是方法 方法是程序…...

360安全浏览器如何彻底卸载
360安全浏览器是一款广泛使用的网络浏览工具,然而由于各种原因,用户可能需要将其从计算机中彻底移除。下面小编就给大家分享几种彻底卸载360安全浏览器的方法,避免留下影响系统性能的残留信息。(本文由https://chrome.cmrrs.com/站…...

构建基于LLM的应用程序——使用LLM的搜索和推荐引擎
在上一章中,我们介绍了构建对话应用程序的核心步骤。我们从一个基础的聊天机器人开始,然后逐步添加了更复杂的组件,例如记忆、非参数化知识和外部工具。借助LangChain的预构建组件以及Streamlit的UI渲染,这一切都变得相对简单。尽…...

Unity3D 模型碰撞检测问题详解
前言 在Unity3D游戏开发中,模型碰撞检测是至关重要的一环,它负责处理物体之间的交互、触发事件以及物理效果的实现。通过精确的碰撞检测,游戏世界得以呈现出更为真实和动态的交互体验。本文将详细介绍Unity3D中的碰撞检测原理、技术实现以及…...

springcloud集成seata实现分布式事务
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网:Apache Seata 文章目录 一、部署1.下载2.修改配置,nacos作注册中心,db存储 二、集成到springcloud项目1.引入依赖2.修改…...

[Leetcode 61][Medium]-旋转链表
目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律:当k大于等于链表中节点总数n时,会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时,无论k的值为多少都可以…...

高效分页策略:掌握 LIMIT 语句的正确使用方法与最佳实践
本文主要介绍limit 分页的弊端及线上应该怎么用 LIMIT M,N 平时经常见到使用 <limit m,n> 合适的 order by 来实现分页查询,这样做到底性能如何呢? 先来简单分析下,然后再实际验证一下。 无索引条件下,需要做大量的文件排…...

拼图游戏02
文章目录 概要整体架构流程代码过程小结 概要 现在需要将图片添加界面中 关键点在于它如何动态地根据游戏状态更新用户界面。它使用了Swing的布局管理器来定位组件,并且通过ImageIcon和JLabel来显示图像。注意,路径字符串中的反斜杠在Java中是转义字符…...

在本地进行Django支付宝扫码支付-当面付开发
这几天涉及到一个个人项目的支付开发场景,正好完成之后,做一下开发记录,给有需要的朋友做一下参考 涉及安装Python环境请参考我专栏中的历史文章,这里不再重复说明 环境: Python3.11 使用Django框架 因本次代码为沙…...

redis-RedisTemplate.opsForGeo 的geo地理位置相关的方法演示
主要方法:add : 添加一个地理位置distance: 计算两个元素之间的距离hash: 获取元素经纬度坐标经过geohash算法生成的base32编码值position: 获取集合中任意元素的经纬度坐标,可以一次获取多个radius:查询某个坐标或某个成员&#…...

做短视频矩阵要十几人团队吗?云微客助阵,一人即可
现在市面上主流的新媒体平台都进军了短视频赛道,对于众多企业和个人来说,短视频矩阵更是成为了提升影响力和拓展业务的关键。企业或个人可以根据自身产品特点和目标用户群体,构建账号矩阵,在多平台上建立账号矩阵,还可…...

常用语音识别开源工具的对比与实践
常用语音识别开源工具的对比 一.工具概述 1. WeNet 设计目标:WeNet 的设计主要聚焦于端到端(E2E)语音识别,特别是在流式识别方面的优化。其目标是提供一个可以在实际应用中达到低延迟和高精度的系统。模型架构: Con…...

Fortify代码安全测试工具在静态应用安全测试(SAST)方面针对典型问题的改进
Fortify代码安全测试工具作为行业内资深的老牌软件安全测试工具,可以同时支持静态代码扫描和动态代码扫描,本文我们讲述的主要是在静态代码扫描领域Fortify所面临的问题,以及最新的改进。 在应用安全领域,特别是静态应用安全测试&…...

AWS 消息队列服务 SQS
AWS 消息队列服务 SQS 引言什么是 SQSSQS 访问策略 Access Policy示例:如何为 DataLake Subscription 配置 SQS 引言 应用系统需要处理海量数据,数据发送方和数据消费方是通过什么方式来无缝集成消费数据的,AWS 提供 SQS 消息队列服务来解决…...

【iOS】——响应者链和事件传递链
事件传递 事件传递流程 发生触摸事件后,系统会将该事件封装成UIEvent对象加入到一个由UIApplication管理的事件队列 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口…...

mysql查询慢
可能是连接数,或者缓存不够,可尝试添加如下参数,重启mysql [mysqld] max_connections50000 interactive_timeout604800 lock_wait_timeout600 wait_timeout604800 net_read_timeout604800 log-error/var/lib/mysql/mysqld.log slow_qu…...

【Java-==与equals】
与equals区别: 1.是关系运算符,equals()是0bject类中定义的方法 2.基本数据类型: 使用比较值,无法使用equals() 3.引用数据类型: 使用比较内存地址; 如果没有重写equals(),仍然调用的是0bject父类的equals(()方法,则比较的是内…...

ai回答 部署前端项目时需要使用ssh吗
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上安全地访问远程计算机。SSH 提供了加密的命令行登录到远程计算机的功能,以及远程命令执行和其他服务。它常用于系统管理员管理服务器、开发者进行远程开发、用户通过终端访问…...

结合ChatGPT与Discord,提高团队合作效率
本文将教你如何集成Discord Bot,助力团队在工作中实现更高效的沟通与协作。通过充分发挥ChatGPT的潜力,进一步提升工作效率和团队协作能力。无需编写任何代码即可完成本文所述的操作,进行个性化定制只需对参数进行微调即可。 方案介绍 如果在…...

VisualStudio|开发环境相关技巧及问题
哈喽,你好啊,我是雷工! 本节继续学习VisualStudio相关内容,以前学习都是以能用为主,没有系统的学习,接下来会系统的学习相关内容, 以下为学习笔记。 01 第三方dll调用 ①:如果第三…...