【Springcloud】分布式搜索elasticsearch

这篇具有很好参考价值的文章主要介绍了【Springcloud】分布式搜索elasticsearch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


先看下翻译:

【Springcloud】分布式搜索elasticsearch

一、初识ElasticSearch

1、用途与发展历史

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

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

【Springcloud】分布式搜索elasticsearch

【Springcloud】分布式搜索elasticsearch

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

【Springcloud】分布式搜索elasticsearch

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

【Springcloud】分布式搜索elasticsearch

在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创建索引:

【Springcloud】分布式搜索elasticsearch
给id创建索引,生成一个B+树,根据id检索的数据就会非常快。但当检索的是标题字段(标题较长,一般不加索引,即便加了,以后模糊匹配也就不生效了),如下:

【Springcloud】分布式搜索elasticsearch

这样逐行扫描,最终也能拿到完整的数据集,但大数据量下,这个耗时太长!接下来看倒排索引:(倒字是为了凸显和之前的大不一样,不是刚好相反的意思)

【Springcloud】分布式搜索elasticsearch

elasticsearch采用倒排索引:

  • 文档(document):每条数据就是一个文档
  • 词条(term):文档按照语义分成的词语

给title建立倒排索引的时候,先按照词条分开,再和文档id一起存入。重复的词条不再重复插入,只在文档id后面加上新id即可。如此,词条不重复,建立索引的时候可哈希,也可B+树

【Springcloud】分布式搜索elasticsearch
以上:虽然要先查询倒排索引,再查询正向索引(id),但是无论是词条、还是文档id都建立了索引,查询速度非常快!无需全表扫描。到这儿,应该加深了对倒排索引的"倒"字的理解了,倒即相对正,之前是根据id查数据,现在是根据关键字查id,再由id查数据。

posting list

倒排索引中包含两部分内容:

1)词条词典(Term Dictionary):记录所有词条,以及词条与倒排列表(Posting List)之间的关系,会给词条创建索引,提高查询和插入效率

2)倒排列表(Posting List):记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息

  • 文档id:用于快速获取文档
  • 词条频率(TF):文档在词条出现的次数,用于评分

【Springcloud】分布式搜索elasticsearch

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

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

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

正向索引

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

倒排索引

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

3、ES核心概念

文档和字段

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

【Springcloud】分布式搜索elasticsearch
而Json文档中往往包含很多的字段(Field),类似于数据库中的列。

索引(index)

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

【Springcloud】分布式搜索elasticsearch
例如:

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

【Springcloud】分布式搜索elasticsearch

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

映射(mapping)

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

小总结:

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

4、ES与MySQL的概念点对比

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

【Springcloud】分布式搜索elasticsearch
二者并不是替代关系,而是一种互补:

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

【Springcloud】分布式搜索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的响应结果即为安装成功:

【Springcloud】分布式搜索elasticsearch

2、安装kibana

部署ES可视化工具kibana,先下载镜像,注意和ES版本保持一致

docker pull kibana:7.12.1
# 或者
docker load -i yourPath/kibana.tar

运行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

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

【Springcloud】分布式搜索elasticsearch

访问5601端口:

【Springcloud】分布式搜索elasticsearch

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

【Springcloud】分布式搜索elasticsearch

运行DSL语句测试:

【Springcloud】分布式搜索elasticsearch

3、安装IK分词器

es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词,而默认的分词规则对中文处理并不友好。

在kibana的DevTools中测试:

POST /_analyze
{
  "analyzer": "standard",
  "text": "测试中文分词效果!"
}


/_analyze:请求路径,省略了http://IP:9200,有kibana补充

请求参数:(json)
- analyzer:分词器类型,这里是默认的standard分词器
- text:要分词的内容

分词效果如下:

【Springcloud】分布式搜索elasticsearch

可以看到分词效果为0,不识字。想处理中文分词,可以使用IK分词器。https://github.com/medcl/elasticsearch-analysis-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

离线安装:(推荐)

  • 查看数据卷目录
# 安装插件需要知道elasticsearch的plugins目录位置
# 而上面安装ES时,用了数据卷挂载,因此先查看下这个数据卷的目录
docker volume inspect es-plugins

返回:
[
    {
        "CreatedAt": "2023-05-06T10:06:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
        "Name": "es-plugins",
        "Options": null,
        "Scope": "local"
    }
]

# 说明plugins目录被挂载到了:`/var/lib/docker/volumes/es-plugins/_data `这个目录中。

  • 解压缩分词器安装包,重命名为ik
    【Springcloud】分布式搜索elasticsearch

  • 上传到es容器的插件数据卷中(有挂载关系,上传到宿主机目录es容器中也就有了)
    【Springcloud】分布式搜索elasticsearch

  • 重启es

docker restart es
  • 查看es的日志
docker logs -f es

测试效果:

注意版本保持一致,版本不一致会报错:

【Springcloud】分布式搜索elasticsearch

效果:

【Springcloud】分布式搜索elasticsearch

ik分词器包含两种模式:

  • ik_smart:最少切分,粗粒度
  • ik_max_word:最细切分,细粒度

最少切分的效果:(粗粒度,这四个字能组成一个词,就不看这四个字内部能不能再组成了)

【Springcloud】分布式搜索elasticsearch

最细切分的效果:

【Springcloud】分布式搜索elasticsearch


词条的拓展与停用:

思考分词器底层的实现:应该是一个类似字典的东西,它里面包含的词汇肯定不全,最先想到的就是新词,如白嫖:

【Springcloud】分布式搜索elasticsearch

要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件

【Springcloud】分布式搜索elasticsearch

<?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">ext.dic</entry>
</properties>

然后在这个目录下再新建个名为ext.dic的文件中,添加想要拓展的词语即可。同样的,禁用敏感词汇,还是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">ext.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典-->
        <entry key="ext_stopwords">stopword.dic</entry>
</properties>

【Springcloud】分布式搜索elasticsearch

然后在名为stopword.dic的文件中,添加想要禁用的词语即可:

【Springcloud】分布式搜索elasticsearch文章来源地址https://www.toymoban.com/news/detail-476475.html

# 重启生效
docker restart es

到了这里,关于【Springcloud】分布式搜索elasticsearch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springcloud中间件-----分布式搜索引擎 Elasticsearch

    该笔记是根据黑马程序员的课来自己写了一遍的,b站有对应教程和资料 第一部分 第二部分 第三部分 预计看完跟着练习5小时足够 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如:

    2024年02月08日
    浏览(60)
  • 微服务学习:SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    目录 一、高级篇 二、面试篇 ==============实用篇============== day05-Elasticsearch01 1.初识elasticsearch 1.4.安装es、kibana 1.4.1.部署单点es 1.4.2.部署kibana 1.4.3.安装IK分词器 1.4.4.总结 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.

    2024年02月02日
    浏览(59)
  • SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈

    我们发现在微服务中有一个令人头疼的问题——部署,用Docker去解决这个部署难题 1、项目部署的问题 2、Docker 扔到一台机器上,它们的依赖难道没有干扰吗?不会,docker将打包好的程序放到一个隔离容器去运行,使用沙箱机制,避免互相干扰,之间不可见,这样就解决了混

    2023年04月24日
    浏览(46)
  • (黑马出品_07)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 聚合 可以让我们极其方便

    2024年03月12日
    浏览(56)
  • SpringCloud学习路线(12)——分布式搜索ElasticSeach数据聚合、自动补全、数据同步

    一、数据聚合 聚合(aggregations): 实现对文档数据的统计、分析、运算。 (一)聚合的常见种类 桶(Bucket)聚合: 用来做文档分组。 TermAggregation: 按照文档字段值分组 Date Histogram: 按照日期阶梯分组,例如一周一组,一月一组 度量(Metric)聚合: 用以计算一些值,比如

    2024年02月15日
    浏览(44)
  • (黑马出品_高级篇_04)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

    [此文档是在心向阳光的天域的博客加了一些有助于自己的知识体系,也欢迎大家关注这个大佬的博客](https://blog.csdn.net/sinat_38316216/category_12263516.html) [是这个视频](https://www.bilibili.com/video/BV1LQ4y127n4/?p=5spm_id_from=pageDrivervd_source=9beb0a2f0cec6f01c2433a881b54152c) 消息队列在使用过程中,面

    2024年03月19日
    浏览(48)
  • SpringCloud分布式搜索引擎、数据聚合、ES和MQ的结合使用、ES集群的问题

    目录 数据聚合 聚合的分类 ​编辑 DSL实现Bucket聚合 ​编辑  DSL实现Metrics聚合​编辑 RestAPI实现聚合  对接前端接口​编辑  自定义分词器​编辑 Completion suggester查询 Completion suggester查询 酒店数据自动补全 实现酒店搜索框界面输入框的自动补全  数据同步问题分析​编辑 同

    2024年02月16日
    浏览(50)
  • SpringCloud系列(十六)[分布式搜索引擎篇] - DSL 查询及相关性算分的学习 (部分)

    在SpringCloud系列(十五)[分布式搜索引擎篇] - 结合实际应用场景学习并使用 RestClient 客户端 API这篇文章中我们已经对 RestClient 有了初步的了解, 并且已经将一些数据进行了存储, 但是这并不是我们学习 ElasticSearch 的目的, ElasticSearch 最擅长的还是对数据的搜索及分析, 因此本篇

    2024年02月17日
    浏览(47)
  • 分布式springcloud

    微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。服务器支持的线程和并发数有限,到来的请求一直阻塞,会导致服务器资源耗尽, 从而导致所有其它服务

    2024年02月06日
    浏览(49)
  • 【Springcloud】elk分布式日志

    (1)什么是分布式日志 在分布式应用中,日志被分散在储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。所以我们使用集中化的日志管理,分布式日志就是对大规模日志数据进行采集

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包