ElasticSearch简称es,是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能
ElasticSearch本身是一个存储、计算、搜索数据的引擎,可以结合kibana(数据可视化工具)、Beats(数据抓取工具)、Logstash(数据抓取工具),组成elastic stack(ELK),可应用于日志统计、实时监控等领域。除了elasticsearch本身,其他组件都可以被替代
Lucene:Apache的开源搜索引擎类库,提供了搜索引擎的核心API,elasticsearch就是基于Lucene做的二次开发
文档:每一条数据就是一个文档,在ES中文档是json格式
词条:对文档中的内容分词得到的词语就是词条,中文就按照中文语义分。
比如说一个网页包含可口可乐信息、另外一个网页包含百事可乐信息,这时按照语义可以分为"可口","可乐","百事"这三个词条。如下:
ID | 对应数据(这里假设为网页) |
1 | 可口可乐网页 |
2 | 百事可乐网页 |
这里对上面表格词条按语义分词
词条 | ID |
可口 | 1 |
可乐 | 1,2 |
百事 | 2 |
当我们搜索"可口",对应id为1的网页,就是可口可乐网页,当搜索"可口可乐",对应,分别对应id为1,id为1,2,综合优先展示id为1的网页,即也是可口可乐;当我们搜索“可乐”时,对应id为1,2,则展示id为1和2的网页,也就是所有可乐相关的消息都展示出来了,这就是倒排索引
正向索引:基于文档id创建索引。查询词条时必须先找到文档,再判断是否包含词条
倒排索引:对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,然后获取到文档
MySQL主要负责事务类型操作,保证数据安全性
ES主要负责海量数据的搜索、分析、计算
ES安装
docker network create es-net #创建网络名叫es-net
通过docker pull elasticsearch:7.12.1命令下载es镜像,镜像比较大,下载时间久,也可以自己取外部下载 ,链接: https://pan.baidu.com/s/1r4C37YB9xQZt6yKrm0FXlQ 提取码: nje4,下载后传到虚拟机,通过docker load -i xxx命令加载镜像
加载完后通过docker images可以查看镜像是否存在,然后开始运行镜像
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ #环境变量堆内存配置
-e "discovery.type=single-node" \ #运行模式 ,现在是单点运行
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \ #数据卷挂载
--privileged \ #使容器拥有root权限
--network es-net \ #让该容器加入到我们刚才创建的es-net网络中
-p 9200:9200 \ #http协议端口
-p 9300:9300 \ #各个容器互联端口
elasticsearch:7.12.1
通过docker ps可以查看容器运行状态,或者直接取浏览器访问es端口,如下则表示容器部署并且运行成功
由此也可发现es内部确实都是json格式的
es组件kibana安装,该组件可以将es数据可视化
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \ #指定es地址,因为是在同一个网络,所有可以通过容器名:端口来互联
--network=es-net \
-p 5601:5601 \ #kiban端口
kibana:7.12.1 #版本需和es版本一致
IK分词器
之前谈到es是通过语义来分词,但是对于中文来说不友好,通常会把一句话的每个字都做分词,而不是按照语义来分,IK分词器则可以解决该问题,对中文分词十分友好,所以这里需要使用IK分词器
安装方式有两种:第一种是在线安装,但是下载较慢,这里把命令给出即可
# 进入容器内部
docker exec -it elasticsearch /bin/bash
# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
#退出
exit
#重启容器
docker restart elasticsearch
第二种是离线安装
IK分词器的使用
首先了解以下DSL语句,专门用于操作ES的语句,就像数据库用sql操作一样。刚才安装的kibana组件就可以很好的让我们去实现dsl语句的编写。
ik分词器包含两种模式
如图右面所以,ik分词器根据语义做出了智能分词,这就是一个简单的分词。
除此之外还可以自定义分词,就比如把我上面那句话的"小鱼啦啦"分为一个词,然后把"禁止"这个词作为禁忌词语不让出现,操作如下
在ik插件目录的config目录的IKAnalyzer.cfg.xml文件里做修改
按如下修改
IK Analyzer 扩展配置
ext.dic
stopword.dic
接着在同级目录创建ext.dic和stopword.dic文件,前者添加自定义词汇,后者屏蔽禁忌词汇
建好后去编辑两个文件的内容
其他不管,我屏蔽掉我需要的"禁止",然后保存,docker restart es命令重启容器
效果如上图所示,把我自定义的"小鱼啦啦"变成了一个词条,同时屏蔽掉了"禁止"这个词
此外还有拼音分词器,自定义分词器等等
索引库类似于数据库中的表结构,所以第一步一定先创建索引库
mapping属性:mapping是对索引库中的文档约束,类似于数据库中对字段的约束
mapping常见属性如下
2. index:是否创建倒排索引,默认为true
3. analyzer: 使用哪种分词器
4. properties:字段的子字段
以上就是常见属性,但并非所有属性,下面通过在kibana上写dsl语句来演示
原语句如下
PUT /xiaoyu
{
"mappings":{
"properties":{
"info":{
"type":"text"
, "analyzer": "ik_smart"
},
"tel":{
"type": "keyword",
"index": false
},
"sex":{
"type": "boolean"
},
"name":{
"type": "object",
"properties": {
"firstName":{
"type":"keyword"
},
"lastName":{
"type":"keyword"
}
}
}
}
}
}
这样一个索引库就创建好了,现在对索引库做简单的删改查操作
查询刚才创建的索引库:通过GET /索引库名字即可,查询后执行即可看见查询结果
修改操作:es不支持对已经创建的索引库进行修改!!!只能在已创建的索引库里面增加新的字段
原语句如下
#修改索引库,本质是添加新字段
PUT /xiaoyu/_mapping
{
"properties":{
"age":{
"type":"integer"
}
}
}
删除操作
#删除操作
DELETE /xiaoyu
首先明确一点,文档就类似于数据库中的一条数据,对文档的操作就类似于对数据库中的数据操作,所以文档的操作是在索引库的基础之上的,就像数据库的数据操作是在表里面的一样
原句如下
#新增文档
POST /xiaoyu/_doc/1
{
"info": "这是一条数据,本质上就是一个文档",
"tel": 123,
"sex": false,
"name":{
"firstName":"王",
"lastName":"五"
}
}
查询操作
GET /xiaoyu/_doc/1
删除操作
DELETE /xiaoyu/_doc/1
修改操作:
修改操作分为全量修改和局部修改两种。
全量修改就是把之前的这条数据删除后,把刚刚的数据新增上去,相当于直接替换掉,如果在修改时id没有对应上,则之前的数据没被删除,又把刚刚的数据新增上去了,就变为了新增操作
PUT /xiaoyu/_doc/1
{
"info": "修改这条数据",
"tel": 123,
"sex": false,
"name":{
"firstName":"王",
"lastName":"五"
}
}
局部修改,不做全部替换,只对修改的地方做替换,语法有所区别,“_update”为固定写法
POST /xiaoyu/_update/1
{
"doc":{
"info":"局部修改,只修改info"
}
}