文章目录
Elasticsearch7.17: 快速入门
ElasticSearch简介
ElasticSearch(简称ES)是一个分布式、RESTful 风格的搜索和数据分析引擎,是用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,稳定,可靠,快速,安装使用方便。
客户端支持Java、.NET(C#)、PHP、Python、Ruby等多种语言
官方网站: https://www.elastic.co/
下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
ElasticSearch vs Solr
Solr 是第一个基于 Lucene 核心库功能完备的搜索引擎产品,诞生远早于 Elasticsearch。
当单纯的对已有数据进行搜索时,Solr更快。当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。
- Solr 利用 Zookeeper 进行分布式管理,而Elasticsearch 自身带有分布式协调管理功能。
- Solr 支持更多格式的数据,比如JSON、XML、CSV,而 Elasticsearch 仅支持json文件格式。
- Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
- Solr 是传统搜索应用的有力解决方案,但 Elasticsearch更适用于新兴的实时搜索应用。
Elastic Stack介绍
在Elastic Stack之前我们听说过ELK,ELK分别是Elasticsearch,Logstash,Kibana这三款软件在一起的简称,在发展的过程中又有新的成员Beats的加入,就形成了Elastic Stack。
在Elastic Stack生态圈中Elasticsearch作为数据存储和搜索,是生态圈的基石,Kibana在上层提供用户一个可视化及操作的界面,Logstash和Beat可以对数据进行收集。在上图的右侧X-Pack部分则是Elastic公司提供的商业项目。
指标分析/日志分析:
ElasticSearch应用场景
- 站内搜索
- 日志管理与分析
- 大数据分析
- 应用性能监控
- 机器学习
除了搜索之外,结合Kibana、Logstash、Beats,Elastic Stack还被广泛运用在大数据近实时分析领域,包括日志分析、指标监控、信息安全等多个领域。它可以帮助你探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,甚至通过使用机器学习技术,自动识别异常状况。
通用数据处理流程
ElasticSearch相关概念
基本概念
全文检索
- 通过一个程序扫描文本中的每一个单词,针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数
- 用户查询时,通过之前建立好的索引来查询,将索引中单词对应的文本位置、出现的次数返回给用户,因为有了具体文本的位置,所以就可以将具体内容读取出来了
倒排索引
索引就类似于目录,平时我们使用的都是索引,都是通过主键定位到某条数据,那么倒排索引呢,刚好相反,数据对应到主键。
简单理解,正向索引是通过key找value,反向索引则是通过value找key。ES底层在检索时底层使用的就是倒排索引。
Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引。 可以指定对某些字段不做索引:
优点︰节省存储空间
缺点: 字段无法被搜索
ElasticSearch概念
索引(Index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。
一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。
文档(Document)
Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位。文档会被序列化成JSON格式,保存在Elasticsearch中。
JSON对象由字段组成,每个字段都有对应的字段类型(字符串/数值/布尔/日期/二进制/范围类型)
每个文档都有一个Unique ID,可以自己指定ID或者通过Elasticsearch自动生成。
一篇文档包含了一系列字段,类似数据库表中的一条记录
文档元数据
元数据,用于标注文档的相关信息:
_index:文档所属的索引名
_type:文档所属的类型名
_id:文档唯—ld
_source: 文档的原始Json数据
_version: 文档的版本号,修改删除操作_version都会自增1
_seq_no: 和_version一样,一旦数据发生更改,数据也一直是累计的。Shard级别严格递增,保证后写入的Doc的_seq_no大于先写入的Doc的_seq_no。
_primary_term: _primary_term主要是用来恢复数据时处理当多个文档的_seq_no一样时的冲突,避免Primary Shard上的写入被覆盖。每当Primary Shard发生重新分配时,比如重启,Primary选举等,_primary_term会递增1。
ElasticSearch安装运行
ElasticSearch安装运行
环境准备
- 运行Elasticsearch,需安装并配置JDK
设置$JAVA_HOME - 各个版本对Java的依赖 https://www.elastic.co/support/matrix#matrix_jvm
Elasticsearch 5需要Java 8以上的版本
Elasticsearch 从6.5开始支持Java 11
7.0开始,内置了Java环境
- ES比较耗内存,建议虚拟机4G或以上内存,jvm1g以上的内存分配
可以参考es的环境文件elasticsearch-env.bat
ES的jdk环境生效的优先级配置ES_JAVA_HOME>JAVA_HOME>ES_HOME
下载并解压ElasticSearch
下载地址: https://www.elastic.co/cn/downloads/past-releases#elasticsearch
选择版本:7.17.3
Linux(centos7):
解压:tar -zxvf elasticsearch-7.17.3-linux-x86_64.tar.gz
ElasticSearch文件目录结构
bin : 脚本文件,包括启动elasticsearch,安装插件,运行统计数据等
config : 配置文件目录,如elasticsearch配置、角色配置、jvm配置等。
jdk : java运行环境
data : 默认的数据存放目录,包含节点、分片、索引、文档的所有数据,生产环境需要修改。
lib : elasticsearch依赖的Java类库
logs : 默认的日志文件存储路径,生产环境需要修改。
modules : 包含所有的Elasticsearch模块,如Cluster、Discovery、Indices等。
plugins : 已安装插件目录
主配置文件elasticsearch.yml
cluster.name
:当前节点所属集群名称,多个节点如果要组成同一个集群,那么集群名称一定要配置成相同。默认值elasticsearch,生产环境建议根据ES集群的使用目的修改成合适的名字。
node.name
:当前节点名称,默认值当前节点部署所在机器的主机名,所以如果一台机器上要起多个ES节点的话,需要通过配置该属性明确指定不同的节点名称。
path.data
:配置数据存储目录,比如索引数据等,默认值 $ES_HOME/data,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。
path.logs
:配置日志存储目录,比如运行日志和集群健康信息等,默认值 $ES_HOME/logs,生产环境下强烈建议部署到另外的安全目录,防止ES升级导致数据被误删除。
bootstrap.memory_lock
:配置ES启动时是否进行内存锁定检查,默认值true。
ES对于内存的需求比较大,一般生产环境建议配置大内存,如果内存不足,容易导致内存交换到磁盘,严重影响ES的性能。所以默认启动时进行相应大小内存的锁定,如果无法锁定则会启动失败。
非生产环境可能机器内存本身就很小,能够供给ES使用的就更小,如果该参数配置为true的话很可能导致无法锁定内存以致ES无法成功启动,此时可以修改为false。
network.host
:配置能够访问当前节点的主机,默认值为当前节点所在机器的本机回环地址127.0.0.1 和[::1],这就导致默认情况下只能通过当前节点所在主机访问当前节点。可以配置为 0.0.0.0 ,表示所有主机均可访问。
http.port
:配置当前ES节点对外提供服务的http端口,默认值 9200
discovery.seed_hosts
:配置参与集群节点发现过程的主机列表,说白一点就是集群中所有节点所在的主机列表,可以是具体的IP地址,也可以是可解析的域名。
cluster.initial_master_nodes
:配置ES集群初始化时参与master选举的节点名称列表,必须与node.name配置的一致。ES集群首次构建完成后,应该将集群中所有节点的配置文件中的cluster.initial_master_nodes配置项移除,重启集群或者将新节点加入某个已存在的集群时切记不要设置该配置项。
jvm.options配置文件
jvm的相关配置 建议设置jvm堆内存大小为4g
Xms和Xms设置成—样
Xmx不要超过机器内存的50%
不要超过30GB
启动常见问题
ES不允许使用root账号启动服务,如果你当前账号是root,则需要创建一个专有账户
#为elaticsearch创建用户并赋予相应权限
adduser es
passwd es
chown -R es:es /usr/local/es/elasticsearch-7.17.3
# 切换es用户
su es
修改配置文件
[4]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
cluster.name: elasticsearch
node.name: node-1
path.data: /usr/local/es/elasticsearch-7.17.3/data
path.logs: /usr/local/es/elasticsearch-7.17.3/logs
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
discovery.seed_hosts: ["127.0.0.1"]
cluster.initial_master_nodes: ["node-1"]
缺少默认配置,至少需要配置 discovery.seed_hosts/discovery.seed_providers/cluster.initial_master_nodes中的一个 参数.
- discovery.seed_hosts: 集群主机列表
- discovery.seed_providers: 基于配置文件配置集群主机列表
- cluster.initial_master_nodes: 启动时初始化的参与选主的node,生产环境必填
修改/etc/security/limits.conf
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
# 在文件末尾中增加下面内容
# 每个进程可以打开的文件数的限制
es soft nofile 65536
es hard nofile 65536
修改/etc/security/limits.d/20-nproc.conf
[2]: max number of threads [1024] for user [es] is too low, increase to at least [4096]
# 在文件末尾中增加下面内容
# 每个进程可以打开的文件数的限制
es soft nofile 65536
es hard nofile 65536
# 操作系统级别对每个用户创建的进程数的限制
* hard nproc 4096
# 注:* 带表 Linux 所有用户名称
修改/etc/sysctl.conf
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
# 在文件中增加下面内容
# 一个进程可以拥有的 VMA(虚拟内存区域)的数量,默认值为 65536
vm.max_map_count=655360
重新加载
sysctl -p
启动es
#启动
bin/elasticsearch
#后台启动
bin/elasticsearch -d
访问 ip:9200
出现这个表示启动成功
客户端Kibana安装
Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作
下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana
选择版本:7.17.3
解压:tar -zxvf kibana-7.17.3-linux-x86_64.tar.gz
修改Kibana.yml
server.port: 5601
server.host: "localhost" #服务器ip
elasticsearch.hosts: ["http://localhost:9200"] #elasticsearch的访问地址
i18n.locale: "zh-CN" #Kibana汉化
运行Kibana
注意:kibana也需要非root用户启动
bin/kibana
#后台启动
nohup bin/kibana &
出现错误:Error: Unable to write to UUID file at /usr/local/es/kibana-7.17.3-linux-x86_64/data/uuid. Ensure Kibana has sufficient permissions to read / write to this file
需要赋予写权限
chown -R es:es kibana-7.17.3-linux-x86_64
访问Kibana
http://192.168.10.111:5601/app/home#/
Elasticsearch安装分词插件
Elasticsearch提供插件机制对系统进行扩展。以安装analysis-icu这个分词插件为例
在线安装
#查看已安装插件
bin/elasticsearch-plugin list
#安装插件
bin/elasticsearch-plugin install analysis-icu
#删除插件
bin/elasticsearch-plugin remove analysis-icu
测试:
离线安装
本地下载相应的插件,解压,然后手动上传到elasticsearch的plugins目录,然后重启ES实例就可以了。
比如ik中文分词插件:https://github.com/medcl/elasticsearch-analysis-ik
测试:
分词还支持自定义分词扩展和热更新。这个可以在github上的README.md中有提到
自定义扩展
热更新 IK 分词使用方法
ElasticSearch基础操作
索引操作
索引命名必须小写,不能以下划线开头
#创建索引
put /es_db
{
"settings" : {
"index" : {
"analysis.analyzer.default.type": "ik_max_word",
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
}
#查询索引
GET /es_db
#es_db是否存在
HEAD /es_db
#删除索引
DELETE /es_db
文档操作
POST和PUT都能起到创建/更新的作用,PUT需要对一个具体的资源进行操作也就是要确定id才能进行更新/创建,而POST是可以针对整个资源集合进行操作的,如果不写id就由ES生成一个唯一id进行创建新文档,如果填了id那就针对这个id的文档进行创建/更新
# 创建文档,指定id
# 如果id不存在,创建新的文档,否则先删除现有文档,再创建新的文档,版本会增加
PUT /es_db/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}
#创建文档,ES生成id
POST /es_db/_doc
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "广州天河公园",
"remark": "java developer"
}
#根据id查询文档,格式: GET /索引名称/_doc/id
GET /es_db/_doc/1
# 查询前10条文档
GET /es_db/_doc/_search
#删除文档 格式: DELETE /索引名称/_doc/id
DELETE /es_db/_doc/1
# 全量更新,替换整个json
PUT /es_db/_doc/1/
{
"name": "张三",
"sex": 1,
"age": 25
}
# 部分更新:在原有文档上更新
# Update -文档必须已经存在,更新只会对相应字段做增量修改
POST /es_db/_update/1
{
"doc": {
"age": 28
}
}
并发场景下修改文档
_seq_no和_primary_term是对_version的优化,7.X版本的ES默认使用这种方式控制版本,所以当在高并发环境下使用乐观锁机制修改文档时,要带上当前文档的_seq_no和_primary_term进行更新
:
POST /es_db/_doc/1?if_seq_no=5&if_primary_term=1
{
"name": "李四xxx"
}
如果版本号不对,会抛出版本冲突异常,如下图: