1. 今日内容
1.ES介绍
2.ES安装
3.ES语法
4.ES集群搭建
2. 学习目标
1.能够理解倒排索引计算
2.能够自己安装ES服务
3.能够掌握ES的基本语法
一 ES介绍
1. 简介
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,用于存储PB级别的数据,易于扩展,es对lucene进行封装,让开发人员可以使用restful风格请求直接调用。
2. 走进lucene
介绍
开源的搜索引擎
倒排索引技术
倒排索引表建立
搜索过程
分词器
单字分词:
原句:
“我们是优秀的31期学员,年薪百万”
分词后:
我,们,是,优,秀,的,31,期,学,员,年,薪,百,万
双字分词:
原句:
“我们是优秀的31期学员,年薪百万”
分词后:
我们,们是,是优,优秀,秀的,的31,31期,期学…
词库分词:
预先制定好词库,词库中存在的词就可以拆分出来参与倒排索引表的建立,如果词库中不存在该词,那么不会拆分出来。
ik分词器(常用),庖丁分词器…
二、ES安装
1. 权限
- es为了安全在启动时不可以使用root用户启动
- 在操作所有与es相关的事情全部使用新建的用户来操作
- 在解决es安装过程中报错的问题全部使用root用户解决
2. ES安装命令
#1.新建用户es-31
useradd es-31
#2.设置密码 需要输入两次(最后一次是确认密码)
passwd es-31
#3.切换至es-31用户 root用户切换至其他用户不需要输入密码,root是最高权限的用户,其他用户切换至root用户需要输入root账号的密码
su - es-31
#4.上传es安装包
rz
#5.解压
tar -xvf elasticsearch-6.8.0.tar.gz
#6.删除安装包
rm -rf elasticsearch-6.8.0.tar.gz
#7.重命名文件夹名称
mv elasticsearch-6.8.0 elasticsearch
#8.切换至配置文件夹
cd elasticsearch/config
#9.修改jvm大小
vim jvm.options
-Xms256m
-Xmx256m
#10.修改es配置文件 以下配置的位置一定要与自己实际位置一致
vim elasticsearch.yml
path.data: /home/es-31/elasticsearch/data
path.logs: /home/es-31/elasticsearch/logs
network.host: 0.0.0.0
#11.切换至bin启动
cd /home/es-31/elasticsearch/bin/
./elasticsearch #前台启动方式----》在当前窗口输出日志 ctrl+c停止运行
./elasticsearch -d #后台启动方式----》在当前窗口不会输出日志
#12.使用root用户解决错误
#12.使用root用户解决错误
#12.使用root用户解决错误
[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65535]
vim /etc/security/limits.conf
#在复制粘贴以下配置时需要注意粘贴进去后会自动追加注释 # 需要将注释去除,千万不要将* 删除,*表示对所有用户生效
#可打开的文件描述符的最大数(软限制)
* soft nofile 65536
#可打开的文件描述符的最大数(硬限制)
* hard nofile 131072
#单个用户可用的最大进程数量(软限制)
* soft nproc 4096
#单个用户可用的最大进程数量(硬限制)
* hard nproc 4096
#13.关闭所有的会话窗口-----》crt关闭/连接工具关闭 ----》重新连接
#14.再次启动es测试访问
cd /home/es-31/elasticsearch/bin/
./elasticsearch #前台启动方式----》在当前窗口输出日志 ctrl+c停止运行
http://ip:9200
3. 安装可视化插件
kibana安装命令
#1.必须使用es-31用户
#2.上传安装包 kibana-6.8.0-linux-x86_64.tar.gz
rz
#3.解压
tar -xvf kibana-6.8.0-linux-x86_64.tar.gz
#4.删除安装包
rm -rf kibana-6.8.0-linux-x86_64.tar.gz
#5.重命名
mv kibana-6.8.0-linux-x86_64 kibana
#6.修改配置文件
cd kibana/config
vim kibana.yml
#允许所有的ip访问
server.host: "0.0.0.0"
#中文展示---》配置文件最后一行
i18n.locale: "zh-CN"
#7.切换至bin启动 要求先启动es再启动kibana,因为kibana在启动时回去连接es的9200端口
cd ../bin
./kibana
#8.访问
http://ip:5601
#9.使用开发工作
#10.如果发现kibana之前可以启动,突然启动不了
#a.查看es是否正常启动
#b.先停止kibana+es,再删除es data目录下面的所有数据
rm -rf /home/es-31/elasticsearch/data/*
4. 安装ik分词器
#1.必须使用es-31用户
#2.切换至 /home/es-31/elasticsearch/plugins
cd /home/es-31/elasticsearch/plugins
#3.创建文件夹 文件夹名称必须叫 analysis-ik
mkdir analysis-ik
#4.切换至 analysis-ik文件夹
cd analysis-ik
#5.上传安装包 elasticsearch-analysis-ik-6.8.0.zip
#6.解压
unzip elasticsearch-analysis-ik-6.8.0.zip
#7.删除安装包 (必须)
rm -rf elasticsearch-analysis-ik-6.8.0.zip
#8.切换至es bin目录启动es
cd ../../bin
./elasticsearch
#9.测试
ik分词测试
#ik_max_word 最细粒度分词
#ik_smart 最粗粒度分词
POST _analyze
{
"text": "南京市长江大桥",
"analyzer": "ik_smart"
}
POST _analyze
{
"text": "南京市长江大桥",
"analyzer": "ik_max_word"
}
5. 扩展和停止词库
扩展词典:顾名思义是在不满足用户需求的情况下,可以自定词典来进行分词
停止词典:顾名思义是在不满足用户需求的情况下,可以自定词典来不进行分词
#1.切换至词典目录
cd /home/es-31/elasticsearch/plugins/analysis-ik/config
#2.创建自己的词典
vim 31.dic
江大桥
#3.将扩展词典进行引用
vim IKAnalyzer.cfg.xml
<entry key="ext_dict">31.dic</entry>
#4.访问测试
POST _analyze
{
"text": "南京市长江大桥",
"analyzer": "ik_max_word"
}
三 ES语法
0.对比关系
1. 索引库操作
#0. es是遵循restful风格请求
#1.创建索引库
PUT /blog1
#2.查看索引库
GET /blog1
#3.删除索引库
DELETE /blog1
2. 类型详解
PUT /索引库名称/_mapping/类型名称 或者 /索引库名称/类型名称/_mapping
{
"properties":{
"字段名称":{
"type":"类型",
"index": true,
"store": false,
"analyzer": "分词器"
}
}
}
type: 类型
-
String类型:
- text—>文本,不可以参与聚合分组
- keyword----->关键字,可以参与聚合分组,并且关键字不可以分词。
-
数值类型:
- 基本数据类型: Integer,double,long…
- 高精度数据
-
日期类型:
- 一般不会使用日期数据类型,因为日期类型占用空间较大,一般使用毫秒值用long类型
-
对象
-
数组
index:
是否索引,默认值为true表示要进行索引。
store
是否要独立存储的意思,默认值为false,表示不独立存储,独立存储的字段查询效率要更高一些。
analyzer
ik_max_word : 最细粒度分词(常用)
ik_smart
3. 类型语法
#1.创建索引库
PUT /heima
#2.创建类型
PUT /heima/_mapping/goods
{
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"subtitle": {
"type": "text",
"analyzer": "ik_max_word"
},
"images": {
"type": "keyword",
"index": "false"
},
"price": {
"type": "float"
}
}
}
#3.查看类型
GET /heima/_mapping/goods
4. 文档操作
#1.新增文档-->id随机生成
POST /heima/goods
{
"title": "小米手机",
"images": "http://image.leyou.com/12479122.jpg",
"price": 2699.00
}
#2.根据id查询文档
GET /heima/goods/_Im4uHQB0rCWCYLQr7Hq
#3.指定id新增文档
POST /heima/goods/1
{
"title": "大米手机",
"images": "http://image.leyou.com/12479122.jpg",
"price": 2999.00
}
GET /heima/goods/1
#4.更新文档
POST /heima/goods/1
{
"title": "超大米手机",
"images": "http://image.leyou.com/12479122.jpg",
"price": 3999.00
}
#5.删除文档
DELETE /heima/goods/1
#6.删除所有
POST heima/_delete_by_query
{
"query": {
"match_all": {}
}
}
5. 查询
初始化查询数据
千万不要格式化下面的数据操作,因为不识别,必须是压缩格式执行
POST /heima/goods/_bulk
{"index":{}}
{"title":"大米手机","images":"http://image.leyou.com/12479122.jpg","price":3288}
{"index":{}}
{"title":"小米手机","images":"http://image.leyou.com/12479122.jpg","price":2699}
{"index":{}}
{"title":"小米电视4A","images":"http://image.leyou.com/12479122.jpg","price":4288}
基本查询
#1.查询所有
POST /heima/_search
{
"query": {
"match_all": {}
}
}
#2.模糊匹配查询
POST /heima/_search
{
"query": {
"match": {
"title": "小米手机"
}
}
}
#3.多字段匹配查询
#为了查询效果添加数据
POST /heima/goods
{
"title": "华为手机",
"images": "http://image.leyou.com/12479122.jpg",
"price": 5288,
"subtitle": "小米"
}
POST /heima/_search
{
"query": {
"multi_match": {
"query": "小米",
"fields": [
"title",
"subtitle"
]
}
}
}
#4.精确匹配查询 term
POST /heima/_search
{
"query": {
"term": {
"price": {
"value": "5288"
}
}
}
}
#5.多条件精确查询 terms
POST /heima/_search
{
"query": {
"terms": {
"price": [
"2699",
"5288"
]
}
}
}
_source结果过滤
includes: 包含查询字段,null值会自动过滤
excludes:不包含查询字段
#结果过滤查询 select * from table
# select title from table
POST /heima/_search
{
"query": {
"match_all": {}
},
"_source": {
"includes": [
"subtitle",
"title"
]
}
}
POST /heima/_search
{
"query": {
"match_all": {}
},
"_source": {
"excludes": [
"subtitle",
"title"
]
}
}
高级查询(了解)
-
bool组合查询
GET /heima/_search { "query":{ "bool":{ "must": { "match": { "title": "小米" }}, "must_not": { "match": { "title": "电视" }}, "should": { "match": { "title": "手机" }} } } } #结果是只会查询到小米手机
-
范围查询(rang)
POST /heima/_search
{"query": {
"range": {
"price": {
"gte": 2699,
"lte": 4288
}
}
}}
-
模糊查询
#1.新增测试数据 POST /heima/goods/4 { "title":"apple手机", "images":"http://image.leyou.com/12479122.jpg", "price":5899.00 } #2.默认模糊查询支持错一个字母 POST /heima/_search { "query": { "fuzzy": { "title": "appla" } } } #3.模糊查询最多支持错两个字母 POST /heima/_search { "query": { "fuzzy": { "title": { "fuzziness": 2, "value": "appaa" } } } }
排序
需要指定排序字段
指定排序的方式
POST /heima/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "asc"
}
}
]
}
高亮
pre_tags: 前置标签
post_tags: 后置标签
fields: 高亮字段
注意事项:
不能使用查询所有来进行高亮,因为高亮需要将查询条件分词后进行高亮显示
POST /heima/_search
{
"query": {
"match": {
"title": "小米手机"
}
},
"highlight": {
"pre_tags": "<span color='red'>",
"post_tags": "</span>",
"fields": {
"title": {}
}
}
}
分页
limit 10,15
pageNum: 第几页
pageSize: 页大小
起始索引位置: int start = (pageNum -1)* pageSize
es中的分页:
from: 其实索引位置
size: 页大小
POST /heima/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "asc"
}
}
],
"from": 0,
"size": 2
}
四、ES集群搭建
1. ES集群架构
2.ES搭建步骤:
#0.搭建集群
node-01 9201 9301
node-02 9202 9302
node-03 9203 9303
#1.做虚拟机快照
#2.删除es data目录下的数据
rm -rf /home/es-31/elasticsearch/data/*
#3.重命名es文件夹名称 操作此命令当前目录是在/home/es-31
mv elasticsearch elasticsearch-01
#4.修改配置文件
node-01配置文件:
cluster.name: itheima-31
node.name: node-01
path.data: /home/es-31/elasticsearch-01/data
path.logs: /home/es-31/elasticsearch-01/logs
http.port: 9201
transport.tcp.port: 9301
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301", "127.0.0.1:9302","127.0.0.1:9303"]
discovery.zen.minimum_master_nodes: 2
#5.复制
cp -r elasticsearch-01 elasticsearch-02
cp -r elasticsearch-01 elasticsearch-03
#6.修改复制好的节点
node.name: node-02
path.data: /home/es-31/elasticsearch-02/data
path.logs: /home/es-31/elasticsearch-02/logs
http.port: 9202
transport.tcp.port: 9302
node.name: node-03
path.data: /home/es-31/elasticsearch-03/data
path.logs: /home/es-31/elasticsearch-03/logs
http.port: 9203
transport.tcp.port: 9303
#7.多打开几个会话窗口同时启动
配置文件
3. kibana修改
elasticsearch.hosts: ["http://localhost:9201","http://localhost:9202","http://localhost:9203"]
4. 集群使用测试
PUT /heima
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
"mappings": {
"goods": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}