一、安装Elasticsearch
1、安装Elasticsearch
1.1、创建普通用户
ES不能使用root用户来启动,必须使用普通用户来安装启动。
创建一个es专门的用户(必须)
# 使用root用户在服务器执行以下命令
先创建组,再创建用户:
1)创建elasticsearch 用户组
[root@localhost ~]# groupadd elasticsearch
2) 创建用户es并设置密码
[root@localhost ~]# useradd es
[root@localhost ~]# passwd es
3) 创建es文件夹
[root@localhost ~]# mkdir -p /usr/local/es
4) 用户es添加到elasticsearch用户组
[root@localhost ~]# usermod -G elasticsearch es
[root@localhost ~]# chown -R es /usr/local/es/
5) 设置sudo权限
# 为了让普通用户有更大的操作权限,我们一般都会给普通用户设置sudo权限,方便普通用户的操作
# 三台机器使用root用户执行visudo命令然后为es用户添加权限
[root@localhost ~]# visudo
#在root ALL-(ALL) ALL一行下面
#添加es用户,如下:
es ALL-(ALL) ALL
#添加成功保存后切换到es用户操作
[root@localhost ~]# su es
[es@localhost root]$
1.2、上传压缩包并解压
将es的安装包下载并上传到服务器的、user/local/es路径下,然后进行解压
使用es用户来执行以下操作
#解压Elasticsearch
su es
cd /user/local
tar -zxvf elasticsearch-7.12.0-linux-x86_64.tar.gz -C /usr/local/es
1.3 、修改配置文件
1.3.1、修改elasticsearch.xml文件
进入服务器使用es用户来修改配置文件
mkdir -p /usr/local/es/elasticsearch-7.12.0/log
mkdir -p /usr/local/es/elasticsearch-7.12.0/data
cd /usr/local/es/elasticsearch-7.12.0/config
vi elasticsearch.yml
cluster.name: xiaoming
node.name: node1
path.data: /usr/local/es/elasticsearch-7.12.0/data
path.logs: /usr/local/es/elasticsearch-7.12.0/log
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: [192.168.132.3"]
cluster.initial_master_nodes: ["node1"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enable: true
http.cors.allow-origin: "*"
1.3.2、修改jvm.option
修改jvm.option配置文件,调整jvm堆内存大小
cd /usr/local/es/elasticsearch-7.12.0/config/
vi jvm.options
-Xms2g
-Xmx2g
2、修改系统配置,解决启动时候的问题
由于现在使用普通用户来安装es服务,且es服务对服务器的资源要求比较多,包括内存大小,线程数等。
2.1、普通用户打开文件的最大数限制
问题错误信息描述:
max file descriptos [4096] fro elasticsearch process likely too low, increase to at least [65536]
ES因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除linux系统当中打开文件最大数目的限制,不然ES启动就会抛错
sudo vi /etc/security/limits.conf
添加如下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
此文件修改后需要重新登录用户,才会生效
2.2、普通用户启动线程数限制
问题错误信息描述
max number of threads [1024] for user [es] likely too low, increase to at least [4096]
修改普通用户可以创建的最大线程数
原因:无法创建本地线程问题,用户最大可创建线程数太小解决方案:修改90-nproc.conf配置文件。
vi /etc/security/limits.d/20-nproc.conf
找到如下内容
* soft nproc 1024修改为
* soft nproc 4096
2.3、普通用户调大虚拟内存
错误信息描述:
max virtual memory areas vm.max_map_count [65539] likely too low, increase to at least [262144]
调大系统的虚拟内存
原因:最大虚拟内存太小,每次启动机器都手动执行下
vi /etc/sysctl.conf
追加如下内容
vm.max_map_count=655360
保存后,执行:sysctl -p
3.启动ES服务
使用es用户执行以下命令启动es服务
cd /usr/local/es/elasticsearch-7.12.0/bin/
后台启动ES
./elasticsearch -d
启动成功之后在浏览器输入即可看到服务进程
http://192.168.132.3:9200/?pretty
二、客户端kibana安装
1.客户端可以分为图形界面客户端,和代码客户端
2.ES主流客户端Kibana,开放9200端口与图形界面客户端交互
1).下载kibana放之、usr/local/es目录中
2).解压文件: tar -zxvf kibana-7.12.0-linux-x86_64.tar.gz
3).进入/usr/local/es/kibana-7.12.0-linux-x86_64/config目录
4).使用vi编辑器:vi.kibana.yml
server.port:5601
server.host: "服务器IP"
elasticsearch.hosts: ["http://IP:9200"] #这里是elasticsearch的访问地址
5).启动kibana
cd /usr/local/es/kibana-7.12.0-linux-x86_64/bin
./kibana
三、安装IK分词器
1.下载Elasticsearch IK分词器
https://github.com/medcl/elasticsearch-analysis-ik/releases
2.切换到es用户,并在es的安装目录下/plugins创建ik
mkdir -p /usr/local/es/elasticsearch-7.12.0/plugins/ik/
3.将下载的ik分词器上传并解压到该目录
cd /usr/local//es/elasticsearch-7.12.0/plugins/ik
unzip elasticsearch-analysis-ik-7.12.0.zip
4.重启elasticsearch
5.测试
粗粒度拆分
细粒度拆分
四、指定IK分词器作为默认分词器
ES的默认分词设置的是standard,这个在中文分词时就比较尴尬了,会单字拆分。
PUT /school_index
{
"settings": {
"index": {
"analysis.analyzer.default.type": "ik_max_word"
}
}
}
五、ES数据管理
1、ES数据管理概述
ES是面向文档的,这意味着它可以存储整个对象或文档。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。
在ES中,你可以对文档(而非成行成列的数据)进行索引,搜索,排序,过滤。ES使用JSON作为文档序列化格式。
JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
2.基本操作
1) 创建索引
格式: PUT /索引名称
举例:PUT /es_db
2) 查询索引
格式:GET /索引名称
举例: GET /school_index
3)删除索引
格式:DELETE /索引名称
举例:DELETE /school_index
4)添加文档
格式:PUT /索引名称/类型/id
PUT /school_index/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "上海世纪公园"
}
5)修改文档
格式: PUT /索引名称/类型/id
PUT /school_index/_doc/1
{
"name": "张三",
"sex": 1,
"age": 25,
"address": "上海世纪公园"
}
6)查询文档
格式:GET /索引名称/类型/id
GET /school_index/_doc/1
7)删除文档
格式:DELETE /索引名称/类型/id
举例:DELETE /es_db/_doc/1
六、查询操作
1、查询当前类型中的所有文档 _search
格式:GET /索引名称/类型/_search
举例:GET /es_db/_doc/_search
2、条件查询,如要查询age等于28岁的
格式:GET /索引名称/类型/_search?q=*:***
举例:GET /es_db/_doc/_search?q=age:28
3.范围查询,如要查询age在25至26岁之间的
格式:GET /索引名称/类型/_search?q=***[25 TO 26]
举例:GET /es_db/_doc/_search?q=age[25 TO 26]
4、根据多个ID进行批量查询_mget
格式:GET /索引名称/类型/_mget
举例:GET /es_db/_doc/_mget
{
"ids":["1","2"]
}
5、查询年龄小于等于28的 :<=
格式:GET /索引名称/类型/_search?q=age:<=**
举例:GET /es_db/_doc/_search?q=age:<=28
6、查询年龄大于28前的 :>
格式:GET /索引名称/类型/_search?q=age:>**
举例:GET /es_db/_doc/_search?q=age:>28
7、分页查询 from=*&size=*
格式:GET /索引名称/类型/_search?q=age[25 TO 26]&from=0&size=1
举例:GET /es_db/_doc/_search?q=age[25 TO 26]&from=0&size=1
8、对查询结果只输出某些字段 _source=字段,字段
格式:GET /索引名称/类型/_search?_source=字段,字段
举例:GET /es_db/_doc/_search?_source=name,age
9、对查询结果排序 sort=字段:desc/asc
格式:GET /索引名称/类型/_search?sort=字段:desc
举例:GET /es_db/_doc/_search?sort=age:desc
七、DSL语言高级查询
ES提供了强大的查询语言(DSL),它可以允许我们进行更加强大、复杂的查询,elasticsearch DSL中有Query与Filter两种
1、Query方式查询,会在ES中索引的数据都会存储在一个_score分值,分值越高就代表越匹配。里外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。
1)根据名称精确查询姓名 term,term查询不会对字段进行分词查询,会采用精确匹配
注意:采用term精确查询,查询字段映射类型属于为keyword
举例:
POST /es_db/_doc/_search
{
"query": {
"term": {
"name": "admin:
}
}
}
2)根据备注信息模糊查询match,match会根据该字段的分词器,进行分词查询
POST /es_db/_doc/_search
{
"form": 0,
"size": 2,
"query": {
"match": {
"address": "广州"
}
}
}
3)多字段模糊匹配查询与精准查询 multi_match
POST /es_db/_doc/_search
{
"query": {
"multi_match": {
"query": "张三",
"fields":["address","name"]
}
}
}
4)范围查询
注:join请求字符串中部分字段的含义
range:范围关键字
gte: 大于等于
lte: 小于等于
gt: 大于
lt: 小于
now: 当前时间
POST /es_db/_doc/_search
{
"query": {
"range": {
"age": {
"gte": 25,
"lte": 28
}
}
}
}
5) 分页、输出字段、排序综合查询
POST /es_db/_doc/_search
{
"query": {
"range": {
"age": {
"gte": 25,
"lte": 28
}
}
},
"from": 0,
"size": 2,
"_source": ["name","age","book"],
"sort": {"age": "desc"}
}
2、Filter过滤器方式查询,它的查询不会计算相关性分值,也不会对结果进行排序,因此效率会高一点,查询的结果可以被缓存。
Filter Context对数据进行过来
POST /es_db/_doc/_search
{
"query": {
"bool": {
"filter": {
"term": {
"age": 25
}
}
}
}
}
八、文档映射
1.ES中映射可以分为动态映射和静态映射
动态映射:
在关系数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段、类型、长度、主键等,最后才能基于表插入数据。而elasticsearch中不需要定义Mapping映射,在文档写入Elasticsearch时,会根据文档字段自动识别类型,这种机制称之为动态映射。
动态映射规则如下:
JSON数据 | 自动识别的类型 |
---|---|
null | 没有字段被添加 |
true或false | Boolean类型 |
小数 | float类型 |
数字 | long类型 |
日期 | data或text |
字符串 | text |
数组 | 由数组第一个非空值决定 |
JSON对象 | object类型 |
静态映射:
静态映射是在Elasticsearch中也可以事先定义好映射,包含文档的各字段类型、分词器等,这种方式称之为静态映射。
2、动态映射
2.1、删除原创建的索引
DELETE /es_db
2.2、创建索引
PUT /es_db
2.3、创建文档(ES根据数据类型,会自动创建映射)
PUT /es_db/_doc/1
{
"name": "jack",
"sex": 1,
"age": 25,
"book": "es入门",
"address": "小明"
}
2.4、获取文档映射
GET /es_db/_mapping
3、静态映射
3.1、删除原创建的索引
DELETE /es_db
3.2、创建索引
PUT /es_db
3.3、设置文档映射
PUT /es_db/_doc/1
{
"mappings": {
"properties": {
"name": {
"type": "keyword",
"index": true,
"store": true
},
"sex": {
"type": "integer",
"index": true,
"store": true
},
"age": {
"type": "integer",
"index": true,
"store": true
},
"book": {
"type": "text",
"index": true,
"store": true
},
"address": {
"type": "text",
"index": true,
"store": true
}
}
}
}
3.5、获取文档映射
GET /es_db/_mapping
九、keyword与text映射类型的区别
将book 字段设置为keyword映射(只能精准查询,不能分词查询,能聚合、排序)
PUT /es_db/_doc/_search
{
"query": {
"term": {
"book":"elasticsearch入门至精通"
}
}
}
将book字段设置为text映射(能模糊查询,能分词查询,不能聚合,排序)
PUT /es_db/_doc/_search
{
"query": {
"match": {
"book":"elasticsearch入门至精通"
}
}
}
十、创建静态映射时指定text类型的ik分词器
1.设置IK分词器的文档映射
PUT /es_db/_doc/1
{
"mappings": {
"properties": {
"name": {
"type": "keyword",
"index": true,
"store": true
},
"sex": {
"type": "integer",
"index": true,
"store": true
},
"age": {
"type": "integer",
"index": true,
"store": true
},
"book": {
"type": "text",
"index": true,
"store": true,
"analyzer": "ik_smart"
},
"address": {
"type": "text",
"index": true,
"store": true
}
}
}
}