elasticsearch是一款非常强大的
开源搜索引擎
,可以帮助我们从海量数据中快速找到需要的内容
以下是生活中ES的使用场景:
项目在运行的时候会产生海量的日志信息,而elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK
),即ELK技术栈。被广泛应用在日志数据分析、实时监控等领域。
而ES是ELK技术栈的核心,负责存储、搜索、分析数据。
在ES的底层的实现,是Lucene,Lucene是一个Java语言的搜索引擎类库(jar包),是Apache公司的顶级项目,官网地址:https://lucene.apache.org/
Lucene的优势:
Lucene的缺点:
ES就是基于Lucence开发的,官网地址: https://www.elastic.co/cn/。相比与lucene,elasticsearch具备下列优势:
小总结:
什么是elasticsearch?
一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能
什么是elastic stack(ELK)?
是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
什么是Lucene?
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API
传统数据库如MySQL采用的是正向索引,如给下表中的id创建索引:
给id创建索引,生成一个B+树,根据id检索的数据就会非常快。但当检索的是标题字段(标题较长,一般不加索引,即便加了,以后模糊匹配也就不生效了),如下:
这样逐行扫描,最终也能拿到完整的数据集,但大数据量下,这个耗时太长!接下来看倒排索引:(倒字是为了凸显和之前的大不一样,不是刚好相反的意思)
elasticsearch采用倒排索引:
文档(document):每条数据就是一个文档
词条(term):文档按照语义分成的词语
给title建立倒排索引的时候,先按照词条分开,再和文档id一起存入。重复的词条不再重复插入,只在文档id后面加上新id即可。如此,词条不重复,建立索引的时候可哈希,也可B+树
以上:虽然要先查询倒排索引,再查询正向索引(id),但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描。
posting list
倒排索引中包含两部分内容:
1)词条词典(Term Dictionary):记录所有词条,以及词条与倒排列表(Posting List)之间的关系,会给词条创建索引,提高查询和插入效率
2)倒排列表(Posting List):记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息
什么是文档和词条?
- 每一条数据就是一个文档
- 对文档中的内容分词,得到的词语就是词条
什么是正向索引?
基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条。是**根据文档找词条的过程**。
什么是倒排索引?
对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档。是**根据词条找文档的过程**。
正向索引:
倒排索引:
文档和字段
elasticsearch是面向文档存储的
,文档可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中。
而Json文档中往往包含很多的字段(Field),类似于数据库中的列。
索引(index)
索引(Index),就是相同类型的文档的集合。
因此,可以把索引当做是数据库中的表。 一个索引下的文档字段结构相同,一个MySQL表下的数据字段结构相同。
映射(mapping)
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。
小总结:
- 文档:一条数据就是一个文档,es中是Json格式
- 字段:Json文档中的字段
- 索引:同类型文档的集合
- 映射:索引中文档的约束,比如字段名称、类型
ES和MySQL的整体概念对比如下:
后面要部署ES可视化工具kibana的容器,因此需要让es和kibana容器互联。这里先创建一个网络:
docker network create es-net
拉取镜像
docker pull elasticsearch:7.12.1
# 有镜像包的话也可直接导入
docker load -i es.tar
启动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
-e "cluster.name=es-docker-cluster"
:设置集群名称-e "http.host=0.0.0.0"
:监听的地址,可以外网访问-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"
:ES运行时的内存大小,默认1G-e "discovery.type=single-node"
:非集群模式-v es-data:/usr/share/elasticsearch/data
:挂载逻辑卷,绑定es的数据目录-v es-logs:/usr/share/elasticsearch/logs
:挂载逻辑卷,绑定es的日志目录-v es-plugins:/usr/share/elasticsearch/plugins
:挂载逻辑卷,绑定es的插件目录--privileged
:授予逻辑卷访问权--network es-net
:加入一个名为es-net的网络中-p 9200:9200
:端口映射配置,暴露端口,9200是供用户访问的-p 9300:9300
:ES各个节点容器之间互联的端口,单机模式下不暴露也行http://IP:9200 即可看到elasticsearch的响应结果即为安装成功:
下载镜像,注意和ES版本保持一致
docker pull ...
# 或者
docker load -i ...
运行docker命令,部署kibana
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601 \
kibana:7.12.1
--network es-net
:加入一个名为es-net的网络中,与elasticsearch在同一个网络中-e ELASTICSEARCH_HOSTS=http://es:9200"
:设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch-p 5601:5601
:端口映射配置kibana启动一般比较慢,需要多等待一会,可以通过命令:
docker logs -f kibana
看到这个日志即为安装成功:
试试Dev Tools这个工具,来发送DSL语句:
运行DSL语句测试: