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:查询某个坐标或某个成员&#…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...

[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...