ElasticSearch简称es,是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能
ElasticSearch本身是一个存储、计算、搜索数据的引擎,可以结合kibana(数据可视化工具)、Beats(数据抓取工具)、Logstash(数据抓取工具),组成elastic stack(ELK),可应用于日志统计、实时监控等领域。除了elasticsearch本身,其他组件都可以被替代
Lucene:Apache的开源搜索引擎类库,提供了搜索引擎的核心API,elasticsearch就是基于Lucene做的二次开发
概念介绍文档:每一条数据就是一个文档,在ES中文档是json格式
词条:对文档中的内容分词得到的词语就是词条,中文就按照中文语义分。
比如说一个网页包含可口可乐信息、另外一个网页包含百事可乐信息,这时按照语义可以分为"可口","可乐","百事"这三个词条。如下:
这里对上面表格词条按语义分词
当我们搜索"可口",对应id为1的网页,就是可口可乐网页,当搜索"可口可乐",对应,分别对应id为1,id为1,2,综合优先展示id为1的网页,即也是可口可乐;当我们搜索“可乐”时,对应id为1,2,则展示id为1和2的网页,也就是所有可乐相关的消息都展示出来了,这就是倒排索引
正向索引:基于文档id创建索引。查询词条时必须先找到文档,再判断是否包含词条
倒排索引:对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,然后获取到文档
mysql和elasticSearch的对应关系
MySQL主要负责事务类型 *** 作,保证数据安全性
ES主要负责海量数据的搜索、分析、计算
ES及其组件安装ES安装
- 我的所有安装都是在docker里进行的,因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络:
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数据可视化
- 首先还是去服务器拉取镜像,或者通过外部下载,然后加载镜像,链接: https://pan.baidu.com/s/1HuKxFp1RloR22z1PFrGOwQ 提取码: haay
- 完成镜像加载后,开始运行容器
docker run -d --name kibana -e ELASTICSEARCH_HOSTS=http://es:9200 #指定es地址,因为是在同一个网络,所有可以通过容器名:端口来互联 --network=es-net -p 5601:5601 #kiban端口 kibana:7.12.1 #版本需和es版本一致
运行成功后可在浏览器访问5601端口
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插件是安装在es的插件目录里的,所以安装插件需要知道elasticsearch的plugins目录位置,因为之前创建了数据卷es-plugins,所以可以通过docker volume inspect es-plugins命令查看数据卷信息,找到具体的目录位置,然后将IK分词器插件直接上传到该文件目录里即可,分词器链接: https://pan.baidu.com/s/1iw9bYlmngrnwaLDMyqYHkg 提取码: 4jup
- 重启容器,安装成功
IK分词器的使用
首先了解以下DSL语句,专门用于 *** 作ES的语句,就像数据库用sql *** 作一样。刚才安装的kibana组件就可以很好的让我们去实现dsl语句的编写。
首先访问kibana的首页
然后出现如下控制台,可以直接在这里写dsl语句
ik分词器包含两种模式
- ik_smart`:最少切分
- ik_max_word`:最细切分
然后我随便写一个简单的分词
如图右面所以,ik分词器根据语义做出了智能分词,这就是一个简单的分词。
除此之外还可以自定义分词,就比如把我上面那句话的"小鱼啦啦"分为一个词,然后把"禁止"这个词作为禁忌词语不让出现, *** 作如下
在ik插件目录的config目录的IKAnalyzer.cfg.xml文件里做修改
按如下修改
IK Analyzer 扩展配置 ext.dic stopword.dic
接着在同级目录创建ext.dic和stopword.dic文件,前者添加自定义词汇,后者屏蔽禁忌词汇
建好后去编辑两个文件的内容
其他不管,我屏蔽掉我需要的"禁止",然后保存,docker restart es命令重启容器
效果如上图所示,把我自定义的"小鱼啦啦"变成了一个词条,同时屏蔽掉了"禁止"这个词
索引库 *** 作索引库类似于数据库中的表结构,所以第一步一定先创建索引库
mapping属性:mapping是对索引库中的文档约束,类似于数据库中对字段的约束
mapping常见属性如下
- type:字段数据类型
- 字符串类型:text(可分词的文本),keyword(精确值,例如:品牌、国家、ip地址,即不需要进行分词的类型)
- 数值:long、integer、short、byte、double、float
- 布尔:boolean
- 日期:date
- 对象:object
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" } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)