本人是在小破站上一步一步的学习,学到了第四天的课程,所以想着将学习总结发布一下,之前的学习也会后续补上!
视频链接:04-初识ES-es与mysql的概念对比_哔哩哔哩_bilibili
文件获取:链接:https://pan.baidu.com/s/1BInIJD2KokL0WSA30PG-1Q
提取码:qa7s
一、初始elasticsearch
1.1 了解es
什么是elasticsearch?
elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到搜索的内容
elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。
elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。
elasticsearch的发展
Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:https://lucene.apache.org/ 。
Lucene的优势:
- 易扩展
- 高性能(基于倒排索引)
Lucene的缺点:
- 只限于Java语言开发
- 学习曲线陡峭
- 不支持水平扩展
2004年Shay Banon基于Lucene开发了Compass 2010年Shay Banon 重写了Compass,取名为Elasticsearch。 官网地址: https://www.elastic.co/cn/
目前最新的版本是:7.12.1
相比与lucene,elasticsearch具备下列优势:
- 支持分布式,可水平扩展
- 提供Restful接口,可被任何语言调用
总结:
什么是elasticsearch?
一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。
什么是elastic stack(ELK)?
是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch。
什么是Lucene?
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API。
1.2 倒排索引
正向索引和倒排索引的区别
传统数据库(如MySQL)采用正向索引,例如给下表(tb_goods)中的id创建索引:
正向索引:在搜索“手机”时会按照id一条一条的搜索,看看所有行数据的title那一条包含手机关键字,当面对海量的数据时,会显得耗时长,性能性对于es来说较差。
反向索引:比如说在搜索“华为手机”时,他会将其分成两个词条也就是‘华为’、‘手机’,然后在词条列表查询文档id,最后根据文档id查询文档,将其存入结果集。
倒排索引中包含两部分内容:
- 词条词典(Term Dictionary):记录所有词条,以及词条与倒排列表(Posting List)之间的关系,会给词条创建索引,提高查询和插入效率
- 倒排列表(Posting List):记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息 文档id:用于快速获取文档 词条频率(TF):文档在词条出现的次数,用于评分。
总结:
什么是文档和词条?
- 每一条数据就是一个文档
- 对文档中的内容分词,得到的词语就是词条
什么是正向索引?
基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条
什么是倒排索引?
对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档
1.3 es的一些概念
文档
elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。 文档数据会被序列化为json格式后存储在elasticsearch中。
索引(index):相同类型的文档的集合
映射(mapping):索引中文档的字段约束信息,类似表的结构约束
将上面凌乱的文档信息按照相同类型即索引分成以下三个索引
MySQL与es的概念对比
架构
Mysql:擅长事务类型操作,可以确保数据的安全和一致性
Elasticsearch:擅长海量数据的搜索、分析、计算
总结:
文档:一条数据就是一个文档,es中是Json格式
字段:Json文档中的字段 索引:同类型文档的集合
映射:索引中文档的约束,比如字段名称、类型
elasticsearch与数据库的关系:
- 数据库负责事务类型操作
- elasticsearch负责海量数据的搜索、分析、计算
1.4 安装es、kibana
安装kibana:可以很好的编写DSL语句
部署单点es——创建网络
因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先在虚拟机的centos服务器上创建一个网络:
docker network create es-net
部署单点es——加载镜像
这里采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大,接近1G。不建议大家自己pull。直接拷贝我发的压缩包就行。在xshell软件上利用 'rz' 命令将压缩包进行上传。
Xshell如何与虚拟机进行连接以及如何下载安装虚拟机并且建立centos服务器如果有感兴趣的后面会单独出一期。。。
//对上传的压缩包进行加载
docker load -i es.tar
docker load -i kibana.tar
部署单点es——运行
运行docker命令,部署单点es:
docker run -d \ //-d:后台运行
--name es \ // 顾名思义 起个名字给容器
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ // -e 环境变量的配置
-e "discovery.type=single-node" \ // 运行模式为单点运行,如果集群运行的话 这么需要修改
-v es-data:/usr/share/elasticsearch/data \ // -v :数据卷挂载
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \ //将es容器加到es-net网络中
-p 9200:9200 \ //-p暴露端口,9200暴露的http端口供用户使用,9300 各个节点互联的端口
-p 9300:9300 \
elasticsearch:7.12.1 //镜像名称
docker ps //查看当前运行的容器
当出现和我一样的结果时,说明容器创建成功!
在浏览器输入http://本机ip:9200/ 如果显示下面的json数据 则es安装成功!(9200之前的为自己的IP地址,可以输入ip addr 查看)
部署kibana:
kibana可以给我们提供一个elasticsearch的可视化界面,便于我们学习。
部署(和es命令类似)
运行docker命令,部署kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \ //设置elasticsearch的地址,因为kibana已经与
//elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch
--network=es-net \ //加入一个名为es-net的网络中,与elasticsearch在同一个网络中
-p 5601:5601 \ //端口映射配置
kibana:7.12.1 //一定要与es的版本保持一致
kibana启动一般比较慢,需要多等待一会,可以通过命令:
docker logs -f kibana
查看运行日志,当查看到下面的日志,说明安装成功成功:
也可以输入http://本地ip:5601/查看可视化界面
kibana——DevTools
kibana中提供了一个DevTools界面:
下面这个界面中可以编写DSL来操作elasticsearch。并且对DSL语句有自动补全功能。
安装IK分词器的原因
es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。我们在kibana的DevTools中测试:
POST /_analyze //请求方式+请求路径,这里省略了http://本机ip:9200,有kibana帮我们补充
{
"analyzer": "standard", //standard为默认分词器
"text": "黑马程序员学习java太棒了!"
}
会发现得到的结果它在分词时,英文分的还可以,中文的话是逐一分词,对我们查找文档信息不是很友好,这样的话比如说搜索“手机”关键词时,它将包含手或者机的都搜索出来了,但是结果并不是我们想要的。。。
分词器
处理中文分词,一般会使用IK分词器。https://github.com/medcl/elasticsearch-analysis-ik
ik分词器包含两种模式:
- ik_smart:最少切分,粗粒度
- ik_max_word:最细切分,细粒度
安装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分词器——离线安装ik插件(推荐)
1)查看数据卷目录
安装插件需要知道elasticsearch的plugins目录位置,而我们用了数据卷挂载,因此需要查看elasticsearch的数据卷目录,通过下面命令查看:
docker volume inspect es-plugins
显示结果:
说明plugins目录被挂载到了:/var/lib/docker/volumes/es-plugins/_data
2)上传到es容器的插件数据卷中
也就是 /var/lib/docker/volumes/es-plugins/_data:
首先cd 到该目录下然后利用xftp7传输文件到该目录
3)重启容器
docker restart es
# 查看es日志
docker logs -f es
查看日志发现已经加载成功!
4)测试:
IK分词器包含两种模式:
- `ik_smart`:最少切分
- `ik_max_word`:最细切分
可以试着自己运行一下,就能看出两者之间的差别,最细切分不仅将原句中的“黑马程序员”分成了“黑马”、“程序员”并且将“程序员”分成了“程序"、”员“。
分词少的话自然占有内存就会少,然后存放的总数据信息也会丰富增多。
ik_max_word 自然而然占有内存会多,即缺点,但是搜索精度高。
这个话用的时候就看个人需求咯!!!
但是,如果最近的流行词出现了,这个分词器还能不能适用呢,接下来我们测试一下!
会发现并没有达到我们期望的目标,说明分词器本身的字典中并没有这种新型词汇,那么该怎么解决呢?
解决方案:拓展ik分类器中的词库
1)拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:
2)然后在名为ext.dic的文件中,添加想要拓展的词语即可:
奥力给
当我们想将字典中的一些词停用可以这样做:
要禁用某些敏感词条,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典-->
<entry key="ext_dict">ext.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典-->
<entry key="ext_stopwords">stopword.dic</entry>
</properties>
然后在名为stopword.dic的文件中,添加想要拓展的词语即可:
的
啊
呀
修改完成以后记得重启一下:
docker restart es
最后我们测试一下,发现修改成功!
以上的话就是这次的学习总结,希望能有所帮助!