当前位置: 首页 > news >正文

ES 分布式搜索引擎【一】

文章目录

    • 1. 基本概念
    • 2. 倒排索引
    • 3. ES 和 MySQL
    • 4. 安装 elasticsearch
      • 4.1 创建网络
      • 4.2 拉取镜像
      • 4.3 部署 ES
      • 4.4 运行测试
    • 5. 安装 kibana
      • 5.1 拉取镜像
      • 5.2 部署 kibana
      • 5.3 运行测试
    • 6. 安装 IK 分词器

1. 基本概念

elasticsearch 是一款非常强大的搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。同时它还可以结合 kibana、Logstash 和 Beats,即 ELK,被广泛应用在日志数据分析、实时监控等领域。

elasticsearch 具备以下优势:

① 支持分布式,可水平扩展;
② 提供 Restful 接口,可被任何语言调用。

在这里插入图片描述

2. 倒排索引

传统数据库(MySQL)采用正向索引,如果想要把数据表里面所有的手机都搜索出来,我们的解决办法就是从头到尾一条一条地扫描,效率非常低。

在这里插入图片描述

ES 采用倒排索引,它会创建一个新的表出来,该表包含两个字段:词条和文档 id。

文档:每条数据都是一个文档;
词条:把文档按照语义分成的词语。

倒排索引在存储数据时,会首先把文档内容分成词条存储,词条字段不允许重复,文档 id 逐一跟在后面!

在这里插入图片描述

比如我们要搜索 “华为手机”,首先对用户输入的内容进行分词,得到 “华为” 和 “手机” 两个词条,接着根据这两个词条去倒排数据表里查询文档 id,得到 1、2、3 索引,最后拿着这些索引去正向数据表里查询数据即可,效率有效提升。

正向索引适合直接通过索引搜索,而倒排索引更适合基于文档内容进行搜索,先根据词条找到 id,再根据 id 找到文档!

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

索引:相同类型文档的集合,类似于数据表;
映射:索引中文档字段的约束信息,类似数据表的结构约束。

在这里插入图片描述

3. ES 和 MySQL

概念对比:

在这里插入图片描述

MySQL 擅长事务类型操作,可以确保数据的安全性和一致性,ES 更擅长海量数据的搜索、分析和计算!

在这里插入图片描述

一条请求过来,首先会交给服务器去判断,如果是写操作,就交给 MySQL 来完成,如果是读操作,就去 ES 里进行搜索,同时,MySQL 会将自己的数据同步给 ES!

4. 安装 elasticsearch

4.1 创建网络

docker network create es-net

4.2 拉取镜像

docker pull elasticsearch:7.12.1

在这里插入图片描述

4.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

在这里插入图片描述

4.4 运行测试

访问 9200 端口,如果出现以下界面,代表部署成功。

要用自己虚拟机的 IP 地址访问,通过 ifconfig 命名可获取虚拟机的 IP 地址!

在这里插入图片描述

5. 安装 kibana

kibana 可以给我们提供一个 elasticsearch 的可视化界面,便于我们操作 ES。

kibana 和 elasticsearch 的版本必须保持一致,且必须在同一个网络中,才可以实现互联!

5.1 拉取镜像

docker pull kibana:7.12.1

在这里插入图片描述

5.2 部署 kibana

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

在这里插入图片描述

5.3 运行测试

访问 5601 端口,如果出现以下界面,代表部署成功。

在这里插入图片描述

① 点击 Explore on my own,选择侧边栏的 DevTools

在这里插入图片描述

② 在此可以编写 DSL 语句,如下图是一个查询操作

左边编写 DSL,点击运行按钮,右边输出结果!

在这里插入图片描述

6. 安装 IK 分词器

ES 在创建倒排索引时需要对文档分词,在搜索时也需要对用户输入内容分词。但默认的分词规则对中文的处理并不友好。
我们在 kibana 的 DevTools 中测试一下:

POST _analyze
{
  "analyzer": "standard", 
  "text": "栈老师不回家!"
}

POST 指定请求方式为新增,analyzer 可以指定一个分词器,text 指定要分词的数据内容!

可以看到默认的分词器是逐字分析的,处理中文字符,一般会使用 IK 分词器。

在这里插入图片描述

① 安装 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

可以连线下载,也可以手动将本地的文件拖进去,放到 es-plugins 的 _data 包里就可以了。

在这里插入图片描述

记得重启 ES 容器!

② 测试一下

IK 分词器包含两种模式:ik_smart(最少切分,粒度粗)和 ik_max_word(最细切分,粒度细)。

ik_smart:

在这里插入图片描述

ik_max_word:

在这里插入图片描述

ik_max_word 分的比 ik_smart 更细,但占用内存空间也更大!

相关文章:

  • Nest系列:从环境变量到工程化实践-2
  • 大模型管理工具:LLaMA-Factory
  • 深入理解C++ stl::list 底层实现+模拟实现
  • 多线程与异步任务处理(二):Kotlin协程
  • 深入解析EfficientNet:高效深度学习网络与ResNet的对比(使用keras进行代码复现,并使用cifar10数据集进行实战)
  • 小型充气泵方案:充气泵pcba结构组成
  • Chrome扩展background.js访问剪贴板指南
  • 文本处理Bert面试内容整理-BERT的预训练任务是什么?
  • VulnHub-FristiLeaks_1.3靶机-信息泄露图片base加解密+文件上传+反向shel
  • Qt命名规范制-name() or getName()
  • springboot宠物服务系统-计算机毕业设计源码29146
  • 计算机毕业设计SpringBoot+Vue.js网上服装商城(源码+文档+PPT+讲解)
  • 在 Ubuntu 系统 22.04 上安装 Docker
  • 让 LabVIEW 程序更稳定
  • Python:函数,return返回值与形参实参
  • Excel-to-JSON v2.0.0发布,可以在Excel内部,把Excel表格转换成JSON,嵌套的JSON也能转
  • 我如何从 Java 和 Python 转向 Golang 的脚本和 GUI 工具开发
  • 日历c++自增/自减操作详解
  • MybatisPlus的简单应用与常见功能
  • 自学网络安全(黑客技术)2025年 —三个月学习计划
  • 怎么做一个简易网站/在线生成个人网站
  • 广州购物商城网站开发/佛山百度seo点击软件
  • wordpress 加cdn/深圳seo网络优化公司
  • 淘宝客可以做返利网站吗/seo托管
  • 刚注册在域名可以自己做网站吗/b站视频怎么快速推广
  • 专业团队电影/seo免费培训