抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

ElasticSearch 单机部署

img

单机部署

下载 Elasticsearch

我们下载的Elasticsearch 版本是 7.17.5,下载地址https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-5

1
2
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.5-linux-x86_64.tar.gz
tar -zvxf elasticsearch-7.17.5-linux-x86_64.tar.gz

配置 Elasticsearch

关闭防火墙
1
2
3
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
配置elasticsearch.yml

该配置文件是ES的主配置文件

1
vi elasticsearch.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#设置允许访问地址,配置位0.0.0.0允许任意主机访问
- #network.host: 192.168.0.1
+ network.host: 0.0.0.0

# 配置集群

# node.name: node-1
+ node.name: node-1

- #discovery.seed_hosts: ["host1", "host2"]
discovery.seed_hosts: ["node-1"]

- #cluster.initial_master_nodes: ["node-1", "node-2"]
+ cluster.initial_master_nodes: ["node-1"]

修改Linux句柄数

查看当前最大句柄数
1
sysctl -a | grep vm.max_map_count
修改句柄数
1
vi /etc/sysctl.conf
1
+ vm.max_map_count=262144
生效配置

修改后需要重启才能生效,不想重启可以设置临时生效

1
sysctl -w vm.max_map_count=262144

关闭swap

因为ES的数据大量都是常驻内存的,一旦使用了虚拟内存就会导致查询速度下降,一般需要关闭swap,但是要保证有足够的内存

临时关闭
1
swapoff -a
永久关闭
1
vi /etc/fstab

注释掉swap这一行的配置

image-20220914161151689

修改最大线程数

因为ES运行期间可能创建大量线程,如果线程数支持较少可能报错

配置修改

修改后需要重新登录生效

1
vi /etc/security/limits.conf
1
2
3
4
5
# 添加以下内容
* soft nofile 65536
* hard nofile 65536
* soft nproc 4096
* hard nproc 4096
重启服务
1
reboot

创建ES用户

注意ES不能以 root 用户启动,否则会报错

添加用户
1
2
useradd elasticsearch
passwd elasticsearch
增加管理员权限

增加sudoers权限

1
vi /etc/sudoers
1
+ elasticsearch  ALL=(ALL)       ALL
修改Elasticsearch权限

给ES的安装目录进行授权

1
chown -R elasticsearch:elasticsearch elasticsearch-7.17.5

JVM配置

根据自己的内存自行调整,内存不够则会启动失败

1
vi jvm.options
1
2
3
4
- ##-Xms4g
- ##-Xmx4g
+ -Xms4g
+ -Xmx4g

添加IK分词器

因为后面要用到IK分词,所以我们要安装以下IK分词器

查找

在github中下载对应版本的分词器

1
https://github.com/medcl/elasticsearch-analysis-ik/releases

根据自己的ES版本选择相应版本的IK分词器,因为安装的ES是7.17.5,所以也下载相应的IK分词器

image-20220805133634676

解压

将下载的分词器复制到ES安装目录的plugins目录中并进行解压

1
2
mkdir ik && cd ik
unzip elasticsearch-analysis-ik-7.17.5.zip

启动ElasticSearch

切换用户

切换到刚刚创建的elasticsearch用户

1
su elasticsearch
启动命令

我们可以使用以下命令来进行使用

1
2
3
4
5
# 前台启动
sh bin/elasticsearch

# 后台启动
sh bin/elasticsearch -d
访问测试

访问对应宿主机的9200端口

1
http://192.168.245.151:9200/
重启ElasticSearch
查找进程

先查找ElasticSearch的进程号

1
ps -ef | grep elastic
杀死进程

杀死对应的进程

1
kill -9 49736
启动ElasticSearch

注意不要使用ROOT用户启动

1
sh bin/elasticsearch -d

kibana安装

下载安装 Kibana

kibana 版本 7.17.5
下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-7-17-5

1
2
3
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.5-linux-x86_64.tar.gz
tar -zvxf kibana-7.17.5-linux-x86_64.tar.gz
mv kibana-7.17.5-linux-x86_64 kibana-7.17.5
配置 Kibana
1
vi config/kibana.yml
1
2
3
4
5
6
7
8
- #server.port: 5601
+ server.port: 5601

- #server.host: "localhost"
+ server.host: "0.0.0.0"

- #elasticsearch.hosts: ["http://localhost:9200"]
+ elasticsearch.hosts: ["http://localhost:9200"]
启动 Kibana
切换用户

Kibana也不能以root用户运行,需要切换到elasticsearch权限

1
su elasticsearch
启动kibaba
1
2
3
4
5
#前台运行
sh bin/kibana

#后台运行
nohup sh bin/kibana >/dev/null 2>&1 &
访问测试

访问对应宿主机的5601端口

1
http://192.168.245.151:5601/

ES快速入门

下面我们看下ES的一些基本使用

索引管理

我们使用数据库的第一步就是创建数据库,同样ES也是一样的,第一步也是对索引进行管理

列出索引

我们使用索引的第一步就是列出索引,查看当前数据库有哪些索引

1
GET /_cat/indices?v

image-20220803141523322

创建索引

我们接下来要使用索引就需要创建索引了,Elasticsearch使用PUT方式来实现索引的新增

​ 可以在创建索引的时候不添加任何参数,系统会为你创建一个默认的索引,当然你可以添加附加一些配置信息

1
PUT customer

这样我们就创建了一个索引

image-20220803151216388

查看索引

索引创建完成后,我们接下来就需要对索引进行查询

1
get customer

image-20220803151945360

结果说明

这里返回了一堆数据,具体什么含义呢,我们需要查看字段的详细信息

字段 内容
aliases 别名
mappings 映射
settings 配置
settings.index.creation_date 创建时间
settings.index.number_of_shards 数据分片数,索引要做多少个分片,只能在创建索引时指定,后期无法修改
settings.index.number_of_replicas 数据备份数,每个分片有多少个副本,后期可以动态修改
settings.index.uuid 索引id
settings.index.provided_name 名称
索引是否存在

有时候我们需要检查索引时候存在,我们可以使用HEAD命令验证索引是否存在

1
HEAD customer

出现200表示索引存在

image-20220808142523378

关闭索引

在一些业务场景,我们可能需要禁止掉某些索引的访问功能,但是又不想删除这个索引

1
post customer/_close

这里我们就把这个索引给关闭了

image-20220803152949392

查看索引列表

再次查看索引列表,查看索引的状态

1
GET /_cat/indices?v

我们发现索引已经被关闭了

image-20220803153221311

为什么关闭索引

如果关闭了一个索引,就无法通过Elasticsearch 来读取和写人其中的数据,直到再次打开它

​ 在现实世界中,最好永久地保存应用日志,以防要查看很久之前的信息,另一方面,在Elasticsearch中存放大量数据需要增加资源,对于这种使用案例,关闭旧的索引非常有意义,你可能并不需要那些数据,但是也不想删除它们。

​ 一旦索引被关闭,它在Elasticsearch内存中唯一的痕迹是其元数据,如名字以及分片的位置,如果有足够的磁盘空间,而且也不确定是否需要在那个数据中再次搜索,关闭索引要比删除索引更好,关闭它们会让你非常安心,随时可以重新打开被关闭的索引,然后在其中再次搜索

打开索引

如果我们需要继续启动索引可以直接打开索引

1
post customer/_open

现在我们已经打开了索引

image-20220803153430046

查看索引列表
1
GET /_cat/indices?v

现在索引的状态已经是打开的状态了

image-20220803153525409

删除索引

如果索引中的数据已经不需要了,可以被删除,我们是可以删除索引的,使用以下命令可以删除索引

1
delete customer

这样我们就把索引给删除了

image-20220803175601320

映射管理

映射的创建时基于索引的,你必须要先创建索引才能创建映射,es中的映射相当于传统数据库中的表结构,数据存储的格式就是通过映射来规定的

创建映射

可以在创建索引时指定映射,其中mappings.properties为固定结构,指定创建映射属性

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT customer
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
}
}
}
}

image-20220808143910461

查看映射

查看索引完全信息,内容包含映射信息

1
GET customer/_mapping

image-20220808144250601

文档管理

创建文档(业务ID)

创建文档的时候我们可以手动来指定ID,但是一般不推荐,回对ES插入性能造成影响

​ 如果手动指定ID,为了保证ID不冲突,会先查询一次文档库,如果不存在则进行插入,手动插入多了一次查询操作,性能会有损失。

操作说明
  • 文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式
  • 注意需要在索引后面添加_doc,表示操作文档
  • 在未指定id生成情况,每执行一次post将生成一个新文档
  • 如果index不存在,将会默认创建
使用示例

新增文档,自动生成文档id,并且如果如果添加文档的索引不存在时会自动创建索引

1
2
3
4
5
post customer/_doc/1
{
"name" : "张三",
"age" : 15
}

这样我们就创建了一个文档

image-20220803181022205

返回结果说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"_index" : "customer", #所属索引
"_type" : "_doc", #所属mapping type
"_id" : "1", #文档id
"_version" : 1, #文档版本
"result" : "created", #文档创建成功
"_shards" : {
"total" : 2, #所在分片有两个分片
"successful" : 1, #只有一个副本成功写入,可能节点机器只有一台
"failed" : 0 #失败副本数
},
"_seq_no" : 0, #第几次操作该文档
"_primary_term" : 1 #词项数
}
创建文档(自动ID)

为了提高插入文档效率,我们一般会使用自动生成ID,这样减少一次插入时的查询性能损耗,插入时不指定文档ID,ES就会自动生成ID

​ 自动生成的ID是一个不会重复的随机数,使用GUID算法,可以保证在分布式环境下,不同节点同一时间创建的_id一定是不冲突的

1
2
3
4
5
post customer/_doc
{
"name" : "李四",
"age" : 50
}

这样创建了一个文档,并且文档ID是系统自动生成的_id

image-20220803184615285

更新文档

更新文档和插入文档一样,如果文档ID一致则会进行覆盖更新,而更新又分为全量更新和增量更新

全量更新

和新增文档一样,输入相同的 URL 地址请求,如果请求体变化,会将原有的数据内容覆盖

1
2
3
4
5
post customer/_doc/1
{
"name" : "张三",
"age" : 50
}

image-20220803184231987

增量更新

通过指定_doc方式默认是全量更新,如果需要更新指定字段则需要将_doc改为_update,请求内容需要增加doc表示,原始{“key”: value},更新{“doc”: {“key”: value}}

1
2
3
4
5
6
post customer/_update/1
{
"doc": {
"age" : 55
}
}
查询文档
验证是否存在

可以通过以下命令检查文档是否存在

1
HEAD customer/_doc/1  #查看是否存储,返回200表示已存储
查询文档
1
GET customer/_doc/1  #返回源数据的查询
不返回source

有时候只是查询,不需要具体的源文档字段,这样可以提高查询速度,可以使用以下方式

1
GET customer/_doc/1?_source=false
查询所有

上述只能查询单个,可以查询所有文档,将_doc替换为_search

1
GET customer/_search
删除文档
根据文档ID删除

我们可以根据文档ID进行删除

1
DELETE customer/_doc/1  #指定文档id进行删除
根据条件删除

根据查询条件删除,会先查询然后在删除,可能耗时会比较长

1
2
3
4
5
6
7
8
post customer/_delete_by_query
{
"query": {
"match": {
"age": "15"
}
}
}

中文分词器

IKAnalyzer

IKAnalyzer是一个开源的,基于java的语言开发的轻量级的中文分词工具包

​ 从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本,在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化

使用IK分词器

IK提供了两个分词算法:

  • ik_smart:最少切分。

  • ik_max_word:最细粒度划分。

ik_smart
使用案例

原始内容

1
传智教育的教学质量是杠杠的
测试分词
1
2
3
4
5
GET _analyze
{
"analyzer": "ik_smart",
"text": "传智教育的教学质量是杠杠的"
}

image-20220808115450647

ik_max_word
使用案例

原始内容

1
传智教育的教学质量是杠杠的
测试分词
1
2
3
4
5
GET _analyze
{
"analyzer": "ik_max_word",
"text": "传智教育的教学质量是杠杠的"
}

image-20220808115513668

自定义词库

我们在使用IK分词器时会发现其实有时候分词的效果也并不是我们所期待的

问题描述

​ 例如我们输入“传智教育的教学质量是杠杠的”,但是分词器会把“传智教育”进行拆开,分为了“传”,“智”,“教育”,但我们希望的是“传智教育”可以不被拆开

image-20220808115543696

解决方案

对于以上的问题,我们只需要将自己要保留的词,加到我们的分词器的字典中即可

编辑字典内容

进入elasticsearch目录plugins/ik/config中,创建我们自己的字典文件yixin.dic,并添加内容:

1
2
cd plugins/ik/config
echo "传智教育" > custom.dic

image-20220808115806628

扩展字典

进入我们的elasticsearch目录 :plugins/ik/config,打开IKAnalyzer.cfg.xml文件,进行如下配置:

1
2
3
vi IKAnalyzer.cfg.xml
#增加如下内容
<entry key="ext_dict">custom.dic</entry>
再次测试

重启ElasticSearch,再次使用kibana测试

1
2
3
4
5
GET _analyze
{
"analyzer": "ik_max_word",
"text": "传智教育的教学质量是杠杠的"
}

可以发现,现在我们的词汇”传智教育”就不会被拆开了,达到我们想要的效果了

image-20220808134046401

评论