Elasticsearch概念 使用docker安装Elasticsearch和kibana

news/2024/10/9 15:17:57/

目录

一、Elasticsearch概念

倒排索引和正向索引

正向和倒排

二、ES安装

三、安装 kibana

四、IK分词器

下载ES中文分词器

扩展或停用词条


一、Elasticsearch概念

倒排索引和正向索引

正向索引

        就像在mysql数据中搜索非主键字段的内容,就需要逐条数据的去查,比如加where条件,逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。

倒排索引

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息

  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

 比如以下图片中,小米词条在表数据id为1、3、4中有,文档id就就为1、3、4

 倒排索引的搜索流程如下(以搜索"小米手环"为例):

1)用户输入条件"小米手环""进行搜索。

2)对用户输入内容分词,得到词条:小米、手环。

3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、3、4。

4)拿着文档id到正向索引中查找具体文档。

正向和倒排

那么为什么一个叫做正向索引,一个叫做倒排索引呢?

  • 正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程

  • 倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程

是不是恰好反过来了?

那么两者方式的优缺点是什么呢?

正向索引

  • 优点:

    • 可以给多个字段创建索引

    • 根据索引字段搜索、排序速度非常快

  • 缺点:

    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

  • 优点:

    • 根据词条搜索、模糊搜索时,速度非常快

  • 缺点:

    • 只能给词条创建索引,而不是字段

    • 无法根据字段做排序

ES是面向文档存储的,可以是数据库中的一条商品数据,一个顶单信息

文档信息会被序列化为JSON格式后存储在ES中

索引(index):相同类型的文档集合

映射(mapping):索引中文档的字段约束信息,类似表的结构约束

比如:

我们统一的把Mysql与ES的概念做一下对比:

MySQLElasticsearch说明
TableIndex索引(index),就是文档的集合,类似数据库的表(table)
RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

Mysql:擅长事务类型操作,可以确保数据的安全和一致性

Elasticsearch:擅长海量数据的搜索、分析、计算

Mysql和ES是互补关系,在合适的场景下选择合适的技术

二、ES安装

创建docker网络,在同一网络中的容器可以互联,相互访问

docker network create es-network

 查看已存在的网络

sudo docker network ls

注意】ES docker 镜像的版本为7.17.16 后续安装IK分词器的版本也要与之对应,否则启动报错,kibana版本也最好与之对应

拉取镜像:

sudo docker pull elasticsearch:7.17.16

使用 -m 标志为容器设置内存限制。这样就无需手动设置 JVM 大小了

  • -e "discovery.type=single-node":非集群模式

  • -e "http.host=0.0.0.0":监听的地址,可以外网访问

  • -v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录

  • -v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录

  • -v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录

  • 9200:供用户访问端口

  • 9300:个es结点互访的端口,现在非必须 

sudo docker run -d \--net es-network \-m 1GB \--name es \-e "discovery.type=single-node" \-v ./es/data:/usr/share/elasticsearch/data \-v ./es/plugins:/usr/share/elasticsearch/plugins \-v ./es/logs:/usr/share/elasticsearch/logs \--privileged \-p 9200:9200 \-p 9300:9300 \
elasticsearch:7.17.16

注意要在es/data所在目录下运行,或者改为绝对路径

ES启动有些许慢,可通过ES容器日志查看进度

 sudo docker logs --tail 100 -f es

ElasticSearch文件目录说明

目录说明
bin可执行文件目录
config配置文件目录
jdkJAVA工具包
lib第三方依赖库
logs输出日志目录
modules依赖模块目录
plugins插件目录
data数据存储目录

在浏览器中输入IP+端口访问:http://172.30.171.205:9200 即可看到elasticsearch的响应结果:

三、安装 kibana

kibana可以给我们提供一个elasticsearch的可视化界面,便于学习

拉取镜像:

sudo docker pull kibana:7.17.18

启动kibana容器

与ES需要在同一个网络es-network

添加环境变量ELASTICSEARCH_HOSTS指定ES访问地址,因为在同一个网络下,可以使用主机名es代替IP地址

sudo docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--net=es-network \
-p 5601:5601  \
kibana:7.17.18

 浏览器访问 kibana, http://172.30.171.205:5601

Add integrations:从如何来源添加数据 ; Explore on my own :自己探索,这里我们自己探索

使用Dev Tools对Elasticsearch发送DSL请求,点击旁边三杆,向下翻找到Dev Tools

输入DSL语句查询所有数据,点击三角发送请求

四、IK分词器

        使用默认的ES的分词器对中文的分词效果不好,可以发现ES英文分词效果可以,但是对中文只能一个字一个字的分,在搜索时效率低,并且搜不到自己想要的。所以要下载IK分词器,添加插件

 分词器的作用是什么?

  • 创建倒排索引时对文档分词

  • 用户搜索时,对输入的内容分词

查看ES插件数据卷目录挂在地址,也可以使用自己自己启动容器指定的目录,我的是:-v ./es/plugins:/usr/share/elasticsearch/plugins:

sudo docker volume inspect es-plugins

下载ES中文分词器

前往github上下载:https://github.com/medcl/elasticsearch-analysis-ik/releases,选择版本为7.17.16,复制链接地址

进入挂载目录下(es/plugins),服务器中使用wget命令下载

wget https://github.com/infinilabs/analysis-ik/releases/download/v7.17.16/elasticsearch-analysis-ik-7.17.16.zip

 创建ik目录,并将下载的压缩包解压到当前目录下

mkdir ikunzip elasticsearch-analysis-ik-7.17.16.zip -d ./ik

 或者将压缩包解压后拖入挂载目录下,并重命名为ik

mv elasticsearch-analysis-ik-7.17.16/ ik

 重启ES容器:

sudo docker restart es

IK分词器的分词模式

  • ik_smart:智能切分,粗粒度

  • ik_max_word:最细切分,细粒度

扩展或停用词条

在plugins/ik/config目录下找到 IKAnalyzer.cfg.xml 文件设置添加词条或停用词条的文件地址,这里是当前的config目录下

拓展词条

添加扩展词条,一些网络流词等词库中没有,新建ext.dic文件添加内容,这样就可以对这些没有的不能分词的词进行分词了

停用词条

目录下的stopword.dir文件中添加停用词

比如语气词,敏感词等

  • 利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典

  • 在词典中添加拓展词条或者停用词条

修改后需要重启ES容器,就可以根据自己添加或停用的词进行分词了。

我遇到的问题:

        7.17.20版本的ES没有对应的IK分词器版本,启动ES容器会报错

        7.17.18版本的ES容器,非root用户启动,有莫名的权限问题,贴在评论区了

        所以我改成了7.17.16版本的ES,启动正常,但是如果你是非root用户启动,也不是自己创建的数据卷挂载目录,需要修改es挂载目录 ./es 权限:
 

sudo chown -R teacher:teacher ./es/

END


http://www.ppmy.cn/news/1441397.html

相关文章

Linux---为什么会有粘滞位?

在前面已经讲过目录的rwx权限: 可读权限(r): 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容. 有可写权限(w):如果目录没有可写权限,则无法在目录中创建文件, 也无法在目录中删除文件.可执行权限(x): 如果目录没有可执行权限, 则无法cd到…

如何替代传统的方式,提高能源企业敏感文件传输的安全性?

能源行业是一个关键的基础设施领域,它涉及能源的勘探、开采、生产、转换、分配和消费。随着全球经济的发展和人口的增长,能源需求持续上升,这对能源行业的可持续发展提出了挑战。能源行业的传输场景多种多样,需要重点关注能源企业…

大语言模型在专业领域的应用——教育场景下的大语言模型

教育场景下的大语言模型 构建教育相关的大语言模型数据资源总结教育是人类社会进步的基石,对个人和社会发展都至关重要。在教育系统中,大语言模型已经被用于多种教育相关任务,有助于增强教育场景的智能化、自动化和个性化。 构建教育相关的大语言模型 通常来说,教育应用系…

《Git---Windows Powershell提交信息中文乱码解决方案》

解释: Windows PowerShell中的Git乱码通常是因为字符编码不正确或Git配置不支持Windows系统的默认编码导致的。Git在处理文件时可能使用UTF-8编码,而Windows系统的命令行工具(如PowerShell)默认使用的是Windows-1252或GBK编码。 …

数据结构七:线性表之链式栈的设计

在上篇博客,学习了用数组实现链的顺序存储结构,那是否存在用单链表实现栈的链式存储结构,答案是当然的,相比于顺序栈,用数组实现的栈效率很高,但若同时使用多个栈,顺序栈将浪费很多空间。用单链…

RTC补偿 将核心算法集成在主控MCU中运行,在硬件上增加低成本的温度传感器和晶振,通过软件和硬件的配合

概览 小华HC32F460/HC32L196芯片,将核心算法集成在主控MCU中运行,在硬件上增加低成本的温度传感器和晶振,通过软件和硬件的配合,实现和时钟芯片一样的带有温补功能的高精度RTC,并专门制作了相关的软硬件DEMO。 方案特点…

linux redis 开机自启

安装位置/data/redis访问端口6379配置文件地址/data/redis/bin/ make PREFIX/data/redis install cp redis.conf /data/redis/bin/ cd /data/redis/bin/ ./redis-server /data/redis/bin/redis.conf 配置redis跟随系统启动自动启动 将redis_init_script脚本拷贝到linux的/etc…

RabbitMq基础概念知识复习

消息拥有消息头和消息体,消息具有rounting key,主题交换机和扇形交换机都是分布与订阅的实现方式,主题交换机用于匹配接收的消息的rount key 动态匹配模式匹配到多个符合的队列,扇形fanout交换机则不会使用消息的路由key&#xff…