目录:
一、认识Elasticsearch
二、倒排索引
三、ES的部分概念
四、安装ES、Kibana、分词器
五、索引库操作
六、文档操作
一、认识Elasticsearch
- 1、Lucene
Lucene是Apache的开源搜索引擎类库,提供了搜索引擎的核心API,Elasticsearch底层是基于Lucene来实现的。
- 2、Elasticsearch
Elasticsearch是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能。
- 3、Elastic Stack
Elastic Stack是以Elasticsearch为核心的技术栈,包括Beats、Logstash、Kibana、Elasticsearch。
二、倒排索引
- 1、倒排索引
倒排索引的概念是基于MySQL这样的正向索引而言的。
① 正向索引
如select * from tb_goods where title like %华为%
,过程如下:
- Ⅰ 搜索数据,条件是title符合
%华为%
; - Ⅱ 逐行获取数据,如id为1的数据;
- Ⅲ 判断数据中title是否符合条件;
- Ⅳ 符合条件放入结果集,反之丢弃;
- Ⅴ 重复过程
Ⅰ - Ⅳ
直至逐行搜索结束。
② 倒排索引
两个重要概念:
Ⅰ 文档
:用来搜索的数据,其中的每一条数据就是一个文档,相当于MySQL中row。
Ⅱ 词条
:对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条,例如:华为手机
,拆分为华为
、手机
。
创建倒排索引:
- Ⅰ 将每一个文档的数据利用分词算法分词,得到一个个词条;
- Ⅱ 创建表,每行数据包括词条、词条所在文档id、位置等信息;
- Ⅲ 根据词条唯一性,可以给词条创建索引,例如hash表结构索引。
不难发现,Elasticsearch其实是以空间换时间
,通过创建倒排索引的方式来提升查询效率。
同样的语句select * from tb_goods where title like %华为%
,搜索过程如下:
- Ⅰ 用户输入条件
华为
进行搜索; - Ⅱ 对用户条件进行分词,得到
华为
; - Ⅲ 按照词条'华为',到倒排索引中查找,得到文档id:1、2;
- Ⅳ 根据id到正向索引中找到具体文档。
三、ES的部分概念
- 1、文档和字段
Elasticsearch是面向文档(Document)
存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在Elasticsearch中:
Json文档中往往包含很多的字段(Field),类似于数据库中的列。
- 2、索引和映射
索引(Index)
,就是相同类型的文档的集合
,如:用户文档、商品文档等。可以把索引当做是数据库中的表
。
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping)
,是索引中文档的字段约束信息
,类似表的结构约束。
- 3、MySQL和Elasticsearch
MySQL
:擅长事务类型操作,可以确保数据的安全和一致性;
Elasticsearch
:擅长海量数据的搜索、分析、计算。
所以,实际使用时可以将对安全性要求较高的写操作,使用MySQL实现
,对查询性能要求较高的搜索需求,使用Elasticsearch实现
。
四、安装ES、Kibana、分词器
- 1、创建网络
创建网络,用于容器间互联。
- 2、加载镜像
此处需要注意,elasticsearch:8.1.0
和kibana:8.1.0
两个版本要一致。
- 3、部署运行ES
- 4、部署运行Kibana
官方简单部署供参考,具体命令如下:
- 5、访问ES、Kibana
- ES:
http://192.168.253.128:9200/
- Kibana:
http://192.168.253.128:5601/
- 6、安装分词器
① 查看数据卷目录
② 将分词器文件放到ES容器的插件数据卷中
插件数据卷目录:/var/lib/docker/volumes/es-plugins/_data
③ 重启ES容器使其生效
- 7、使用分词器
打开Kibana控制台,具体操作如下:
选择分词器算法Analyzer: ik_smart
, ik_max_word
,测试使用分词器:
更新 IK 分词:扩展字典&扩展停止词字典(不为其创建词条的词,如:的、啊等。)
分词器配置文件目录:/var/lib/docker/volumes/es-plugins/_data/ik/config
。
五、索引库操作
- 1、mapping映射属性
- type:字段数据类型,常见的简单类型有:
- 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
- 数值:long、integer、short、byte、double、float、
- 布尔:boolean
- 日期:date
- 对象:object
- index:是否创建索引,默认为true
- analyzer:使用哪种分词器
- properties:该字段的子字段
- 2、索引库CRUD
- 创建索引库和映射
PUT /<index>
比如,创建以上先前案例的索引(ES索引
:类似数据库中表
的概念)。
- 查询索引库
GET /<target>
- 修改索引库
PUT /<target>/_mapping
,注意原则上不允许修改已存在的索引库的映射,但是可以新增。
- 删除索引库
DELETE /<index>
六、文档操作
- 新增文档
POST /<target>/_doc/<_id>
:新增文档,已存在则覆盖(可理解为更新);
POST /<target>/_create/<_id>
:新增文档,已存在则报错,"version_conflict_engine_exception"
。
- 查询文档
GET <index>/_doc/<_id>
:查询完整文档,包含版本、序列号等;
GET <index>/_source/<_id>
:查询文档JSON存储的内容。
- 删除文档
DELETE /<index>/_doc/<_id>
- 修改文档
POST /<target>/_doc/<_id>
:新增文档,已存在则覆盖(可理解为更新);
POST /<index>/_update/<_id>
:局部更新,仅更新指定部分。
七、结尾
以上即为Elasticsearch-基础使用的全部内容