ElasticSearch
基础概念 对照mysql这样的数据库来学习
索引—mysql中的表 如用户索引就相当于用户表
文档—mysql表中的一条记录 如:
es中:
{ “id”:5,
“name”:“青青子衿”
}
mysql中:
id name 5 青青子衿 字段 — 很好理解就相当于mysql的属性列名
MySQL | Elasticsearch | 说明 |
---|---|---|
Table | Index | 索引(index),就是文档的集合,类似数据库的表(table) |
Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
SQL | DSL | DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
Elasticsearch:擅长海量数据的搜索、分析、计算
Mysql:擅长事务类型操作,可以确保数据的安全和一致性
安装 建议都用docker安装,要不安装起来真有些麻烦
安装内容
- elasticsearch 提供数据存储、搜索、分析
- kibana 为elasticsearch提供可视化功能
- ik分词库(真不是黑子) 可以为elasticsearch分词进行自定义操作
- 注意安装内容之间都有版本限制,es官网上会有说明,最好是所有软件都安装统一版本
安装elasticsearch
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 \ --network hmall \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:7.12.1
安装kibana
docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ --network=hmall \ -p 5601:5601 \ kibana:7.12.1
安装IK分词器(这个安装路径其实是在es文件下的es-plugins目录下)作为es的一个插件
docker exec -it es ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
安装完成就我们重启一下es容器就可以开始咱们的es开心之旅啦
docker restart es
学习使用IK分词器
先不着急学习es,先看看ik
都是一些什么妖魔鬼怪有什么作用使用IK分词器 首先要保证es、kibana是打开的才能看到效果,而且是先打开es 才能打开kibana。也就两句命令的事在这就不多说了
首先进入Kibana的DevTools上来测试分词器 开启服务后即进入浏览器访问localhost:5601
现在有一个需求:我们搜索一句诗句比如:常记溪亭日暮 希望可以进行模糊搜索 包含常、记、溪亭、日暮的诗句。那么首先要做的事当然是对这句诗句进行分词啦!那么如果我们使用es提供的分词器会得到什么效果呢?咱们一探究竟
在控制台上输入
POST /_analyze { "analyzer": "standard", "text": "常记溪亭日暮" }
看看结果:
可以看到他把每个字都单独拆分了,这其实是符合英文的单词拆分的,一个单词拆分成一个词条,但这对中文十分不友好(谁叫这是老外的东西呢),中文很多时候需要两个字或者多个字在一起才会有特定的意思。那么这个时候就是ik发挥作用的时候了。
IK分词器是由中国开发者搜狗公司(Sogou)开发的。IK分词器支持细粒度和智能切分两种分词模式:
- 细粒度切分(ik_smart): 以最大词长切分文本,适合一般的文本分析应用。
- 智能切分(ik_max_word): 在细粒度切分的基础上,会对长词再次切分,适合需要更精细分词的场景。
现在我们试试ik分词器对这句诗句的分词结果吧。在控制台左边输入:
POST /_analyze
{
"analyzer": "standard",
"text": "常记溪亭日暮"
}
结果如下:
- ik分词添加自定义字典
如此这样,常、记、日暮是好了,但是溪亭还是分开了,这是因为在中文中溪亭本来也不是一个词语,只是李清照笔下的一处赏日落的好去处,ik也不认识这地方。那如何教它认识认识呢?
我们可以到ik分词器的配置文件中修改,大概在这个位置
有个IKAnalyzer.cfg.xml文件里面内容如下(可能略有不同,但没关系)
有两种配置,且都可以配置多个词典
1.扩展词典,作用就是像我们的需求一样,让es认识“溪亭”是一个词语不应该分开,“李清照”是一个诗人人名,也不应该分开。
2.停止词典,作用就是对于一些实际意义不大的词、字通常是一些介词连词比如 在,去,又样的词装作不认识,处理它们的时候直接跳过。比如这样的需求“常记溪亭日暮” 希望分词结果中不包含 常,记两字就可以写入这个词典。
下面我们来对“溪亭”两字进行词典扩展:
1.先创建一个dic文件,比如my.dic,(先创建一个txt文件写完再改成dic文件就行了),注意文件位置要与IKAnalyzer.cfg.xml在同一目录下(当然ik也支持远程词典,挂个url也行)。 格式内容如下:这样他就认识了溪亭是一个词了。
2.在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">authorName</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
<!-- 新加的扩展词典映射-->
<entry key="ext_dict">my</entry>
</properties>
3.重启一下es服务。让它读到这个配置文件。但是es不支持重启,我们只能结束进程然后再开启进程。如果是前台启动就ctrl+C就停止了,后台启动就要去找一下pid然后kill一下。最后再启动es服务。这里演示后台启动情况:
ps -ef | grep elasticsearch
可以看到pid是710627,kill这个进程就可以啦,最后可以检测一下是不是已经停止了
kill -9 710627
再重新启动一下进程,注意es服务挂掉,kibana也会挂掉,所以都需要重新启动
最后我们来看一下成果吧:
可以看到es已经认识‘’溪亭‘’是一个词了。分词结果完全符合我们的需求!!!
kibana学习
其实这个应该放在ik前面,但谁让我们是真爱粉呢,kibana其实也就是相当于一个数据库可视化工具而已,工具我们就掌握一些基本使用方法就可以了。
首先可以对kibana这个工具汉化一下,更好的学习:
打开kibana.yml配置文件中添加一行配置
i18n.locale: "zh-CN"
修改了配置我们就要重新启动kibana,然后使用浏览器访问本机的5601端口