1、简介
什么是elasticsearch?
一个开源的分布式搜索引擎,云可以用来实现搜索、日志统计、分析、系统监控等功能
什么是elastic stack(ELK)?
是以elasticsearch为核心的技术栈,包括beats、Logstash,kibana、elasticsearch
什么是Lucene?
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API
什么是文档和词条?
每一条数据就是一个文档
对文档中的内容分词,得到的词语就是词条
什么是正向索引?
基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条
什么是倒排索引?
对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档
ES组成:
文档:一条数据就是一个文档,es中是Json格式
字段:Json文档中的字段
索引:同类型文档的集合
映射:索引中文档的约束,比如字段名称、类型
elasticsearch与数据库的关系:
数据库负责事务类型操作
elasticsearch负责海量数据的搜索、分析、计算
2、安装ES、Kibana,分词器
Kibana是一个开源的数据可视化工具,通常与Elasticsearch一起使用。
1、因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络:docker network create es-net
2、从dockerhub上pull对应的kibana和ES的镜像,或者直接在网上找资源自己load
3、部署ES:
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 es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1
自上而下含义分别为:
设置Elasticsearch的Java虚拟机选项,指定最小堆内存为512MB,最大堆内存为512MB
设置Elasticsearch的发现类型为单节点,后续集群可再变化
将名为 "es-data" 的数据卷挂载到Elasticsearch容器的数据目录
将名为 "es-plugins" 的数据卷挂载到Elasticsearch容器的插件目录
启用特权模式,容器将拥有对主机系统的更多权限
容器连接到名为 "es-net" 的网络
将主机端口9200映射到容器的9200端口,用于访问Elasticsearch HTTP API
将主机端口9300映射到容器的9300端口,用于Elasticsearch集群通信
运行基于Elasticsearch 7.12.1镜像的容器
部署成功后访问9200端口,将有以下返回:
4、部署kibana:
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1
-e ELASTICSEARCH_HOSTS=http://es:9200 \因为其和es在同一个网络,故可以用容器名互联,其他便大同小异
ps:注意kibana要和es版本对应,kabana启动会较慢
成功创建并运行容器后,访问5601接口可见:
5、安装IK分词器
由于es官方分词器对中文分词支持不太好,故需要再找插件用于对中文分词。
在github上下载对应版本的IK分词器后,通过docker volume inspect es(容器名)找到es对应的插件文件夹,把分词器解压缩后的文件下放进去,restart服务即可
其中kibana的devtool用于方便发送DSL请求给es
6、分词器字典拓展
可以在es挂载的IK插件中找到config文件夹以修改字典配置,增加词或删除词
其中IKAnalyzer.cfg.xml是字典配置文件
其中ext_dic是用于新增词文件的文件名,没有该文件可以自行创建
stopword.dic一般自己会有,直接在其上面新增不想进行分词的词语即可
分词器的作用是什么?
创建倒排索引时对文档分词
用户搜索时,对输入的内容分词
IK分词器有几种模式?
ik_smart:智能切分,粗粒度
ik max word:最细切分,细粒度
IK分词器如何拓展词条?如何停用词条?
利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典
在词典中添加拓展词条或者停用词条
3、索引库操作
1、mapping常见属性有哪些?
type:数据类型
index:是否索引
analyzer:分词器
properties:子字段
type常见的有哪些?
字符串:text、keyword
数字:long、integer、short、byte、double、float
布尔:boolean
日期:date
对象:object
notices:
text和analyzer搭配使用,需要分词的就用text
object用来装多个子字段,子字段需要分别声明数据类型
2、创建索引库示例:
#创建索引库
PUT /heima
{
"mappings": {
"properties": {
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": false
},
"name":{
"type": "object",
"properties": {
"firstName":{
"type":"keyword"
},
"lastName":{
"type":"keyword"
}
}
}
}
}
}
3、索引库的rud
ps:为了保证数据的完整性和一致性索引库不允许修改,但是可以新增
rud示例:
#查询
GET /heima
#删除
DELETE /heima
#新增
PUT /heima/_mapping
{
"properties":{
"age":{
"type":"integer"
}
}
}
索引库操作有哪些?
创建索引库:PUT/索引库名
查询索引库:GET/索引库名
删除索引库:DELETE /索引库名
添加字段:PUT/索引库名/mapping
4、文档操作
文档操作有哪些?
创建文档:POST/索引库名/doc/文档id {json文档}
查询文档:GET/索引库名/doc/文档id
删除文档:DELETE/索引库名/doc/文档id
修改文档:
全量修改:PUT/索引库名/doc/文档id{json文档}
增量修改:POST/索引库名/update/文档id{"doc":{字段}
示例:
#新增文档
POST /heima/_doc/1
{
"info":"ss天下第一",
"email":"shenshao66@gmail.com",
"name":{
"firstName":"s",
"lastName":"s"
}
}
#查询文档
GET /heima/_doc/1
#删除文档
DELETE /heima/_doc/1
#全量修改文档
PUT /heima/_doc/1
{
"info":"ss天下第一",
"email":"shenshao66@gmail.com",
"name":{
"firstName":"s",
"lastName":"s"
}
}
#局部修改文档
POST /heima/_update/1
{
"doc": {
"name":{
"firstName":"d"
}
}