ElasticSearch学习笔记(一)倒排索引、ES和Kibana安装、索引操作

2024-06-20 22:12

本文主要是介绍ElasticSearch学习笔记(一)倒排索引、ES和Kibana安装、索引操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 ElasticSearch入门
    • 1.1 认识ElasticSearch
    • 1.2 倒排索引
      • 1.2.1 正向索引
      • 1.2.2 倒排索引
      • 1.2.3 正向VS倒排
    • 1.3 ES的相关概念
      • 1.3.1 文档和字段
      • 1.3.2 索引和映射
      • 1.3.3 MySQL与ES
  • 2 ES安装
    • 2.1 部署单点ES
      • 2.1.1 创建网络
      • 2.1.2 拉取镜像
      • 2.1.3 运行
    • 2.2 部署Kibana
      • 2.2.1 拉取镜像
      • 2.2.2 运行
      • 2.2.3 DevTools
    • 2.3 安装IK分词器
      • 2.3.1 安装ik插件
      • 2.3.2 测试
      • 2.3.3 扩展词词典
      • 2.3.4 停用词词典
  • 3 索引操作
    • 3.1 mapping映射属性
    • 2.2 索引库的CURD
      • 2.2.1 创建索引库和映射
      • 2.2.2 查询索引库
      • 2.2.3 修改索引库
      • 2.2.4 删除索引库

1 ElasticSearch入门

1.1 认识ElasticSearch

ElasticSearch(下文简称为ES)是一款非常强大的开源搜索引擎,可以从海量数据中快速找到需要的内容。例如:在GitHub搜索代码、在电商网站搜索商品、在百度搜索答案等。

ElasticSearch结合Kibana、Logstash、Beats,被广泛应用在日志数据分析、实时监控等领域。即平常所说的Elastic Stack(ELK)。

  • ElasticSearch:ELK的核心,负责存储、搜索、分析数据。
  • Kibana:数据可视化。
  • Logstash、Beats:数据抓取。

ElasticSearch底层是基于Lucene来实现的。Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:https://lucene.apache.org/。

2004年Shay Banon基于Lucene开发了Compass;2010年Shay Banon 重写了Compass,取名为ElasticSearch。相比Lucene,ElasticSearch优势更明显,它不仅支持分布式,可水平扩展,还提供Restful接口,可被任意语言调用。

1.2 倒排索引

1.2.1 正向索引

例如,有一个数据表tb_goods,其id字段创建了索引:

如果是根据id查询,那么可以直接走索引,查询速度非常快。这种索引就是正向索引

但如果是基于title字段做模糊查询,只能是逐行扫描数据,流程如下:

1)用户搜索数据,条件是title符合"%手机%"
2)逐行获取数据,比如获取到id为1的数据;
3)判断数据中的title是否符合用户搜索条件;
4)如果符合则放入结果集,不符合则丢弃。

逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。

1.2.2 倒排索引

倒排索引中有两个非常重要的概念:

  • 文档(Document:用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息;
  • 词条(Term:对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条。

创建倒排索引是对正向索引的一种特殊处理,流程如下:

1)将每一个文档的数据利用算法分词,得到一个个词条;
2)创建表,每行数据包括词条、词条所在文档id、位置等信息;
3)因为词条唯一性,可以给词条创建索引。

如上图,“小米”这个词条分别存在于id为1、3、4的文档中。

倒排索引的搜索流程如下(以搜索"华为手机"为例):

1)用户输入条件“华为手机”进行搜索;
2)对用户输入内容分词,得到词条:“华为”、“手机”;
3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3;
4)拿着文档id到正向索引中查找具体文档。

先查询倒排索引,再查询倒排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快,而无需全表扫描。

1.2.3 正向VS倒排

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

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

优点缺点
正向索引可以给多个字段创建索引,根据索引字段搜索、排序速度非常快根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描
倒排索引根据词条搜索、模糊搜索时,速度非常快只能给词条创建索引,而不是字段;无法根据字段做排序

1.3 ES的相关概念

1.3.1 文档和字段

ES是面向文档(Document)存储的,它可以是数据库中的一条商品数据,或一个订单信息。文档数据会被序列化为json格式后存储在ES中,而json文档中往往包含很多的字段(Field),类似于数据库中的列。 例如:

1.3.2 索引和映射

索引(Index),就是相同类型的文档的集合。 例如:所有用户文档组织在一起,称为用户的索引;所有商品的文档组织在一起,称为商品的索引。

因此,可以把索引当做是数据库中的表。

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

1.3.3 MySQL与ES

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

MySQL擅长事务类型操作,可以确保数据的安全和一致性;而ES擅长海量数据的搜索、分析、计算。因此在企业中,往往是两者结合使用:

  • 对安全性要求较高的写操作,使用MySQL实现;
  • 对查询性能要求较高的搜索需求,使用ES实现;
  • 两者再基于某种方式,实现数据的同步,保证一致性。

2 ES安装

2.1 部署单点ES

2.1.1 创建网络

由于需要部署ES和Kibana两个容器,因此需要让ES和Kibana容器互联,为此先创建一个网络:

docker network create es-net

2.1.2 拉取镜像

从镜像仓库拉取elasticsearch:7.12.1镜像:

docker pull elasticsearch:7.12.1

但由于网络问题,拉取失败了。这里直接使用已经下载好的镜像,上传到虚拟机后,执行以下命令加载镜像:

docker load -i es.tar

2.1.3 运行

docker run -d \--name es \-e "http.host=0.0.0.0" \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-logs:/usr/share/elasticsearch/logs \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network es-net \-p 9200:9200 \-p 9300:9300 \elasticsearch:7.12.1

命令解释:

  • -e "http.host=0.0.0.0":监听的地址,可以外网访问
  • -e "ES_JAVA_OPTS=-Xms512m -Xmx512m":设置内存大小
  • -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-p 9300:9300:端口映射配置

在浏览器访问:http://192.168.153.128:9200,看到ES的响应结果即部署成功:

2.2 部署Kibana

2.2.1 拉取镜像

docker pull kibana:7.12.1

同样,由于网络原因,镜像拉取失败了。这里也直接使用已经下载好的镜像,上传到虚拟机后,执行以下命令加载镜像:

docker load -i kibana.tar

2.2.2 运行

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

命令解释:

  • -e ELASTICSEARCH_HOSTS=http://es:9200":设置ES的地址,因为Kibana已经与ES在一个网络中,因此可以用容器名直接访问ES
  • --network=es-net:加入一个名为es-net的网络中,与ES在同一个网络中
  • -p 5601:5601:端口映射配置

在浏览器输入地址访问:http://192.168.153.128:5601,看到Kibana页面即部署成功:

2.2.3 DevTools

Kibana中提供了一个DevTools界面,这个界面可以编写DSL来操作ES,并且对DSL语句有自动补全功能:

2.3 安装IK分词器

分词器的作用是:创建倒排索引时对文档分词;用户搜索时,对输入的内容分词。

2.3.1 安装ik插件

# 进入容器内部
docker exec -it es /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 es

此时ES插件的数据卷目录/var/lib/docker/volumes/es-plugins/_data下可以看到安装的ik插件:

2.3.2 测试

IK分词器包含两种模式:

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

在Kibana提供了DevTools中进行测试:

可见,这两个分词模式得到的结果是不一样的。

2.3.3 扩展词词典

日常生活中,有很多新的词语,在原有的词汇列表中并不存在。比如:“奥力给”,“栓Q” 等等。

所以IK分词器提供了扩展词汇的功能,以不断地更新词汇。

  • 1)进入ES容器内部的分词器插件目录
# 进入容器内部
docker exec -it es /bin/bash# 进入分词器插件目录
cd /usr/share/elasticsearch/config/analysis-ik

  • 2)创建一个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>
</properties>

  • 3)新建一个ext.dic文件,内容如下:
奥力给
栓Q

  • 4)重启容器,查看启动日志
docker restart es
docker logs -f es

  • 5)测试

2.3.4 停用词词典

在互联网中,有很多词汇是不允许在网络上传递的,例如关于宗教、政治等敏感词语。为此,IK分词器提供了强大的停用词功能,让我们在索引时就直接忽略停用词汇表中的内容。

  • 1)进入ES容器内部的分词器插件目录
# 进入容器内部
docker exec -it es /bin/bash# 进入分词器插件目录
cd /usr/share/elasticsearch/config/analysis-ik

  • 2)修改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>

  • 3)新建一个stopword.dic文件,内容如下:
你太美

  • 4)重启容器,查看启动日志
docker restart es
docker logs -f es

  • 5)测试

3 索引操作

索引类似于数据库中的表,mapping映射就类似于表结构。因此,要向ES中存入数据,就必须先创建“表”和“表结构”。

3.1 mapping映射属性

mapping映射属性就是对索引库中文档的约束,常见的mapping映射属性有:

  • type:数据类型,常见的类型有:

    • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
    • 数值:long、integer、short、byte、double、float
    • 布尔:boolean
    • 日期:date
    • 对象:object
  • index:是否创建索引,默认为true

  • analyzer:使用哪种分词器

  • properties:该字段的子字段

例如下面这个文档:

{"age": 1000,"weight": 52.1,"isMarried": false,"info": "战斗力最强的人","email":"swk@xyj.cn","score":[99.1, 99.5, 98.9],"name":{"firstName": "孙","lastName": "悟空"}
}
  • age:类型为 integer;参与搜索,因此需要index为true;无需分词器。
  • weight:类型为float;参与搜索,因此需要index为true;无需分词器。
  • isMarried:类型为boolean;参与搜索,因此需要index为true;无需分词器。
  • info类型为字符串,并且需要分词,因此是text;参与搜索,因此需要index为true;分词器可以用ik_smart。
  • email类型为字符串,但是不需要分词,因此是keyword;不参与搜索,因此需要index为false;无需分词器。
  • score虽然是数组,但是只看元素的类型,因此类型为float;参与搜索,因此需要index为true;无需分词器。
  • name:类型为object,需要定义多个子属性
  • firstNamelastName:类型为字符串,但是不需要分词,因此是keyword;参与搜索,因此需要index为true;无需分词器。

2.2 索引库的CURD

2.2.1 创建索引库和映射

基本语法:

  • 请求方式:PUT
  • 请求路径:/索引库名,可以自定义
  • 请求参数:mapping映射

2.2.2 查询索引库

基本语法:

  • 请求方式:GET
  • 请求路径:/索引库名
  • 请求参数:无

2.2.3 修改索引库

倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这又是无法接受的。

因此索引库一旦创建,就无法修改mapping。但是却允许添加新的字段到mapping中,因为这个操作不会对倒排索引产生影响。

基本语法:

  • 请求方式:PUT
  • 请求路径:/索引库名/_mapping
  • 请求参数:mapping映射

2.2.4 删除索引库

基本语法:

  • 请求方式:DELETE
  • 请求路径:/索引库名
  • 请求参数:无

本节完,更多内容请查阅分类专栏:微服务学习笔记

感兴趣的读者还可以查阅我的另外几个专栏:

  • SpringBoot源码解读与原理分析
  • MyBatis3源码深度解析
  • Redis从入门到精通
  • MyBatisPlus详解
  • SpringCloud学习笔记

这篇关于ElasticSearch学习笔记(一)倒排索引、ES和Kibana安装、索引操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079402

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备