【Springcloud】分布式搜索elasticsearch


先看下翻译:

在这里插入图片描述

一、初识ElasticSearch

1、用途与发展历史

elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容

以下是生活中ES的使用场景:

在这里插入图片描述

在这里插入图片描述

项目在运行的时候会产生海量的日志信息,而elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK),即ELK技术栈。被广泛应用在日志数据分析、实时监控等领域。

在这里插入图片描述

而ES是ELK技术栈的核心,负责存储、搜索、分析数据。

在这里插入图片描述

在ES的底层的实现,是Lucene,Lucene是一个Java语言的搜索引擎类库(jar包),是Apache公司的顶级项目,官网地址:https://lucene.apache.org/

Lucene的优势:

  • 易扩展,可二开
  • 高性能(基于倒排索引)

Lucene的缺点:

  • 只限于Java语言开发
  • 学习曲线陡峭
  • 不支持水平扩展

ES就是基于Lucence开发的,官网地址: https://www.elastic.co/cn/。相比与lucene,elasticsearch具备下列优势:

  • 支持分布式,可水平扩展
  • 提供Restful接口,可被任何语言调用
小总结:

什么是elasticsearch?
一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能

什么是elastic stack(ELK)?
是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch

什么是Lucene?
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API

2、倒排索引

传统数据库如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:用于快速获取文档
  • 词条频率(TF):文档在词条出现的次数,用于评分

在这里插入图片描述

什么是文档和词条?
- 每一条数据就是一个文档
- 对文档中的内容分词,得到的词语就是词条

什么是正向索引?
基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条。是**根据文档找词条的过程**。

什么是倒排索引?
对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档。是**根据词条找文档的过程**

正向索引

  • 优点:
    • 可以给多个字段创建索引
    • 根据索引字段搜索、排序速度非常快
  • 缺点:
    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

  • 优点:
    • 根据词条搜索、模糊搜索时,速度非常快
  • 缺点:
    • 只能给词条创建索引,而不是字段
    • 无法根据字段做排序

3、ES核心概念

文档和字段

elasticsearch是面向文档存储的,文档可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中。

在这里插入图片描述
而Json文档中往往包含很多的字段(Field),类似于数据库中的列。

索引(index)

索引(Index),就是相同类型的文档的集合。

在这里插入图片描述
例如:

  • 所有用户文档,就可以组织在一起,称为用户的索引;
  • 所有商品的文档,可以组织在一起,称为商品的索引;
  • 所有订单的文档,可以组织在一起,称为订单的索引;

在这里插入图片描述

因此,可以把索引当做是数据库中的表。 一个索引下的文档字段结构相同,一个MySQL表下的数据字段结构相同。

映射(mapping)

数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。

小总结:

- 文档:一条数据就是一个文档,es中是Json格式
- 字段:Json文档中的字段
- 索引:同类型文档的集合
- 映射:索引中文档的约束,比如字段名称、类型

4、ES与MySQL的概念点对比

ES和MySQL的整体概念对比如下:

在这里插入图片描述
二者并不是替代欢喜,而是一种互补:

  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性
  • Elasticsearch:擅长海量数据的搜索、分析、计算

在这里插入图片描述

二、安装部署

1、单节点部署ES

后面要部署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的响应结果即为安装成功:

在这里插入图片描述

2、安装kibana

下载镜像,注意和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

看到这个日志即为安装成功:

在这里插入图片描述
访问5601端口:

在这里插入图片描述

试试Dev Tools这个工具,来发送DSL语句:

在这里插入图片描述

运行DSL语句测试:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/llg___/article/details/130973932