Elasticsearch简述

Elasticsearch简述

Elasticsearch产品介绍

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

  • 分布式搜索引擎,可以扩展到上百台服务器,处理PB级的数据。
  • RESTFUL API,使用JSON进行数据交换。
  • 实时分析,可以对数据进行实时分析。
  • 高可用性,节点失败时可以自动重分配。
  • 近实时,数据被索引后立即可以被搜索。
  • 支持各种编程语言。

一、安装运行

  1. 安装:参照https://www.elastic.co/cn/downloads/elasticsearch,本文版本6.4.3

  2. 运行:运行bin/elasticsearch,然后就可以访问http://localhost:9200

  3. 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
  1. Development与Production模式说明
  • 以transport的地址是否绑定在localhost为标准判断network.host;
  • Development模式下启动时会以warning的方式提示配置检查异常;
  • Production模式下启动时会以error的方式提示配置检查异常并退出;
  • 参数修改的第二种方式: bin/elasticsearch -E http.port=19200。
  1. 倒排索引
  • 倒排索引是通过分词策略,形成词和文章的映射关系表,这种词典+映射表即为倒排索引。传统的检索是通过文章逐个找到对应关键词的位置。

二、多节点集群

  1. 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表示有主分片没能正常运行。

  1. 集群相关概念
  • 集群是一组有相同的cluster.name的节点。索引可以被拆分成不同的部分进行存储,称为分片,一个索引的不同分片可以部署到不同的节点,这样可以解决数据量太大,单点存储量有限的问题。每个主分片可以有一个或多个副本分片,可以保证高可用。
  1. 数据写入流程
  • 新建、索引和删除请求都是写操作,必须在主分片上完成后才能被复制到相关的副本分片。客户端请求任意的集群节点(协调节点),协调节点将请求转发到指定的节点,主分片需要将数据保存并发送到副本,副本保存后进行反馈,主分片反馈给客户端,客户端获取反馈。
  1. 数据读取流程
  • 客户端发送查询请求到协调节点,协调节点计算数据所在的分片以及全部的副本位置,为了能够负载均衡,轮询所有节点,将请求发送给具体的节点,节点返回查询结果并反馈给客户端。
  1. master选举流程
  • Elasticsearch的选举流程是由ZenDiscovery模块负责的,主要包含Ping和Unicast单播模块。对所有可以成为master的节点根据nodeId字典排序,每次选举每个节点都把自己所知道的节点排序,然后选出第一个节点暂时认为它是master节点。如果对某个节点的投票数达到一定的值并且该节点自己也选举自己,这个节点就是master。master节点负责集群、节点和索引的管理,不负责文档级别的管理,data节点可以关闭http功能。
  1. 路由计算
  • 通过公式shard=hash(routing)%number_of_primary_shards决定文档应该放到哪个分片,routing默认是文档的_id,也可以是自定义的值,通过hash函数获取一个数字,然后获取与主分片数量的余数可以得到文档所在分片的位置。
  • 我们可以把请求发送到集群中的任意一个节点,每个节点都有能力处理任意请求,每个节点都知道集群中任一文档的位置,可以直接将请求转发到需要的节点上。

三、Elasticsearch集群脑裂问题

在集群中因为主节点访问阻塞或者网络不可用导致出现分区,不同分区选举出不同的主节点的现象叫做脑裂。脑裂问题可能会导致数据丢失、不一致或者其他问题。

  1. 脑裂问题的原因
  • 网络问题:集群之间的网络延迟导致一些节点访问不到master,认为master挂了然后重新选出了新的master,并对master上的分片和副本标红,分配新的主分片。
  • 节点过载:主节点的角色既是master又是data,访问量较大时可能会导致停止响应造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉后会重新选出主节点。
  • 内存回收:data节点上的elasticsearch进程占用内存较大,引发JVM的大规模内存回收,造成进程失去响应。
  1. 解决方案
  • 角色分离: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。

  1. create

    POST /accounts/person/1

{"name": "John","lastname": "Dow","job_description": "System administrator and Linux specialit"
}
  1. read

    GET /accounts/person/1

  2. update

    POST /accounts/persion/1/_update

{"doc": {"job_description": "System administrator and Linux specialit"}
}
  1. delete

    DELETE /accounts/person/1

  2. query

  • 查询字符串

    GET /accounts/person/_search?q=john

  • DSL

    GET /accounts/person/_search

{"query": {"match": {"name": "john"}}    
}

五、ik分词器

  1. 插件安装:解压插件到elasticsearch安装路径的plugins目录。
  2. 创建索引库
PUT /ik
{"settings": {"number_of_shards": 5,"number_of_replicas": 1}
}
  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"  }}
}
  1. 插入数据
POST /ik/fulltext/1
{"content": "集群之间的网络延迟导致一些节点访问不到master"
}POST /ik/fulltext/2
{"content": "认为master挂了然后重新选出了新的master"
}
  1. 查询
POST /ik/fulltext/_search
{"query": {"match": {"content": "master"}},# 匹配到的结果会添加指定的样式"highlight": {"pre_tags": ["<font color='red'>"],"post_tags": ["</font>"],"fields": {"content": {}}}
}

六、Java API访问Elasticsearch

  1. 创建工程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>
  1. 在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 '更新时间'

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

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

相关文章

2024前端面试题-网络篇

1.跨域问题 同源策略&#xff1a;需要协议、域名、端口号相同跨域原因&#xff1a;不符合同源策略便会产生跨域问题解决跨域&#xff1a;JSONP、配置代理、通过CORS解决 2.RPC和HTTP的区别 主要区别是序列化和反序列化&#xff0c;RPC通过二进制高效传输&#xff0c;HTTP是j…

AScript 的UI asui模板的导入

两种方案&#xff1a; 第一种直接在web端&#xff0c;右击UI文件夹 第二种在pycharm&#xff0c;也是右击UI文件夹 调用UI&#xff0c;在init类中直接调用即可

Transformer微调实战:通过低秩分解(LoRA)对T5模型进行微调(LoRA Fine Tune)

scient scient一个用python实现科学计算相关算法的包&#xff0c;包括自然语言、图像、神经网络、优化算法、机器学习、图计算等模块。 scient源码和编译安装包可以在Python package index获取。 The source code and binary installers for the latest released version ar…

Aria2安装和使用-Mac版

起因是需要网盘下载&#xff0c;无奈限速很烦&#xff0c;查找很多方案后&#xff0c;最终决定使用Aria2 Tampermonkey。 其中Aria2是一款开源轻量的下载软件&#xff0c;简单来说就是可以通过URL直接下载。 Tampermonkey则是一款插件&#xff0c;我这里是.crx结尾的谷歌插件…

文件IO函数:open/close,read/write,lseek

open和close函数 C语言中的文件IO操作需要使用到open()函数和close()函数来打开和关闭文件。 open()函数的原型如下&#xff1a; int open(const char *pathname, int flags); int open(const char *filename, int flags,mode_t mode);其中&#xff0c;filename表示要打开…

CSS中flex:1是什么属性

flex: 1 是 CSS 中的一个简写属性&#xff0c;用于设置 Flex 项目的灵活伸缩比例&#xff08;flex-grow&#xff09;、收缩比例&#xff08;flex-shrink&#xff09;以及基础大小&#xff08;flex-basis&#xff09;。具体来说&#xff0c;flex: 1 实际上是以下三个属性的简写&…

性能优化理论篇 | swap area是个什么东西

我们知道每台计算机的内存&#xff08;RAM&#xff09;都是有限的&#xff0c;而我们的应用程序需要加载到内存才能被运行&#xff0c;如果一台机器运行多个应用程序时&#xff0c;内存可能会耗尽。Linux 系统中的“交换空间&#xff08;也称为交换分区&#xff09;”可以帮助缓…

c语言利用if嵌套语句制作日程表查询程序

c语言里if嵌套语法是 if(表达式) { if(表达式) 语句1 else 语句2 } else if(表达式) 语句3 else 语句4 ) 这里有一个日程是星期一开会&#xff0c;星期二到星期五上班&#xff0c;星球六去长城&#xff0c;星期天去故宫&#xff0c;输入一个星期几&#xff0c;会…

Google Play开发者账号地址验证难题?这些经验或许能帮到你

目前&#xff0c;想要把应用顺利上架到 Google Play&#xff0c;已经不像以前那么简单了&#xff0c;主要是开发者需要应对 Google 日益严格的审核机制。其中&#xff0c;账号验证的地址验证绝对是让很多人头疼的一个环节。 今天就来给大家分享一些真实的经验和干货&#xff0c…

IA实验:静态路由(1基础版)

实验拓扑&#xff1a; 实验要求&#xff1a; 1.实现全网通 实验思路&#xff1a; 1.给各个设备配置好端口的IP地址并且划分广播域&#xff0c;暂定网段为&#xff1a; 192.168.1.0 192.168.2.0 192.168.3.0 2.pc1去ping各网段的设备以及端口&#xff0c;发现3.0网段以及2.2网…

数控单主轴走心机多少钱

单主轴走心机的价格因品牌、型号、性能及配置等因素而异&#xff0c;因此无法给出一个具体的统一价格。一般来说&#xff0c;单主轴走心机的价格在数万元到数十万元不等。 市场上某些品牌的单主轴走心机价格可能在十几万之间不等&#xff0c;而另一些高端型号或定制产品的价格可…

Bigtop 从0开始(上)

本文作者&#xff1a;蔡佳良 原文阅读&#xff1a;【巨人肩膀社区博客分享】Bigtop 从0开始 BigTop的应用场景&#xff1a; 1. BigTop通过提供预配置的Docker镜像&#xff0c;极大简化了在不同操作系统上编译大数据组件的rpm或deb包的过程&#xff0c;使之变得快捷且高效。 …

苹果上架没有iphone、没有ipad也可以生成截屏

使用flutter、uniapp或其他跨平台框架开发ios的APP&#xff0c;上架的时候都会遇到一个问题&#xff0c;上架的时候需要各种尺寸的设备来做ios截屏。 比如目前最新的要求是&#xff0c;iphone需要三种不同尺寸的设备的截屏&#xff0c;假如支持ipad则还需要使用ipad 2代和ipad…

从0开始搭建个人博客《第十一期:优化网站访问速度》

目录 一、背景说明 二、Nginx性能优化 &#xff08;一&#xff09;文件句柄 1.系统全局性修改和用户局部性修改 2.进程局部性修改 &#xff08;二&#xff09;CPU亲和配置 1.设置工作进程数 2.设置连接数 &#xff08;三&#xff09;事件处理模型优化 &#xff08;四&…

MySql 高阶 概念(了解即可)

mysql 分为4层结构&#xff1a; 连接层&#xff1a;负责处理链接&#xff0c;鉴权&#xff0c;安全。 服务层&#xff1a;负责sql接口&#xff0c;sql分析&#xff0c;sql优化&#xff0c;sql缓存。 引擎层&#xff1a;负责执行服务层的操作&#xff0c;不同的引擎拥有不同的特…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…

这对二婚夫妻结婚半年,一起生活才一个月,就走到了婚姻尽头!

这对二婚夫妻结婚半年&#xff0c;一起生活才一个月&#xff0c;就走到了婚姻尽头&#xff01; 这是一篇涉离婚纠纷的民事起诉状 &#xff08;范文点评&#xff09; 离 婚 起 诉 状 原告&#xff1a;韩某斌&#xff0c;男&#xff0c;现年37岁&#xff0c;汉族&#xff0c;打…

记录一个变量溢出的bug

文章目录 如题 如题 count2变量溢出了&#xff08;超过了255&#xff09;&#xff0c;结果导致busOff_16bitRecordHILTime变量莫名其妙被清0

「C++系列」vector 容器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff1a;人工智能教程 文章目录 一、vector 容器1. 基本特性2. 基本操作3. 注意事项 二、应用场景1. 应用场景2. 案例案例一&#xff1…

DRF——请求的封装与版本管理

文章目录 django restframework1. 快速上手2. 请求数据的封装3. 版本管理3.1 URL的GET参数传递&#xff08;*&#xff09;3.2 URL路径传递&#xff08;*&#xff09;3.3 请求头传递3.4 二级域名传递3.5 路由的namespace传递 小结 django restframework 快速上手请求的封装版本…