【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】

时间:2022-06-03 00:47:43

目录:

一、认识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是否符合条件;
  • Ⅳ 符合条件放入结果集,反之丢弃;
  • Ⅴ 重复过程​​Ⅰ - Ⅳ​​直至逐行搜索结束。

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


② 倒排索引
两个重要概念:
Ⅰ ​​文档​​:用来搜索的数据,其中的每一条数据就是一个文档,相当于MySQL中row。
Ⅱ ​​词条​​:对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条,例如:​​华为手机​​,拆分为​​华为​​、​​手机​​。

创建倒排索引:

  • Ⅰ 将每一个文档的数据利用分词算法分词,得到一个个词条;
  • Ⅱ 创建表,每行数据包括词条、词条所在文档id、位置等信息;
  • Ⅲ 根据词条唯一性,可以给词条创建索引,例如hash表结构索引。

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


不难发现,Elasticsearch其实是​​以空间换时间​​,通过创建倒排索引的方式来提升查询效率。
同样的语句​​select * from tb_goods where title like %华为%​​,搜索过程如下:

  • Ⅰ 用户输入条件​​华为​​进行搜索;
  • Ⅱ 对用户条件进行分词,得到​​华为​​;
  • Ⅲ 按照词条'华为',到倒排索引中查找,得到文档id:1、2;
  • Ⅳ 根据id到正向索引中找到具体文档。

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】

三、ES的部分概念

  • 1、文档和字段

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

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


Json文档中往往包含很多的字段(Field),类似于数据库中的列。

  • 2、索引和映射

​索引(Index)​​,就是相同类型的​​文档的集合​​,如:用户文档、商品文档等。可以把索引当做是数据库中的​​表​​。
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有​​映射(mapping)​​,是索引中文档的字段​​约束信息​​,类似表的结构约束。

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


  • 3、MySQL和Elasticsearch

​MySQL​​:擅长事务类型操作,可以确保数据的安全和一致性;
​Elasticsearch​​:擅长海量数据的搜索、分析、计算。
所以,实际使用时可以将​​对安全性要求较高的写操作,使用MySQL实现​​,​​对查询性能要求较高的搜索需求,使用Elasticsearch实现​​。

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


四、安装ES、Kibana、分词器

  • 1、创建网络

创建网络,用于容器间互联。

docker network create es-net
  • 2、加载镜像

此处需要注意,​​elasticsearch:8.1.0​​和​​kibana:8.1.0​​两个版本要一致。

docker pull elasticsearch:8.1.0
docker pull kibana:8.1.0
  • 3、部署运行ES
docker run -d \
--name es \
--net es-net \
-p 9200:9200 \
-p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \ # 非集群模式
-v es-data:/usr/share/elasticsearch/data \ # 挂载逻辑卷,绑定es的数据目录
-v es-plugins:/usr/share/elasticsearch/plugins \ # 挂载逻辑卷,绑定es的插件目录
--privileged \ # 授予逻辑卷访问权
elasticsearch:8.1.0
  • 4、部署运行Kibana
docker run -d \
--name kibana \
--net es-net \ # 与Elasticsearch加入同一个网络
-e ELASTICSEARCH_HOSTS=http://es:9200 \ # 设置Elasticsearch的地址,Kibana可以用容器名直接访问Elasticsearch
-p 5601:5601 \
kibana:8.1.0

官方简单部署供参考,具体命令如下:

docker network create elastic
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.1.0
docker run --name es-node01 --net elastic -p 9200:9200 -p 9300:9300 -t docker.elastic.co/elasticsearch/elasticsearch:8.1.0

docker pull docker.elastic.co/kibana/kibana:8.1.0
docker run --name kib-01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.1.0
  • 5、访问ES、Kibana
  • ES:​​http://192.168.253.128:9200/​

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


  • Kibana:​​http://192.168.253.128:5601/​

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


  • 6、安装分词器

① 查看数据卷目录

docker volume inspect es-plugins

[
{
"CreatedAt": "2022-03-10T10:28:21+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
"Name": "es-plugins",
"Options": null,
"Scope": "local"
}
]

② 将分词器文件放到ES容器的插件数据卷中
插件数据卷目录:​​​/var/lib/docker/volumes/es-plugins/_data​

③ 重启ES容器使其生效

docker restart es
  • 7、使用分词器

打开Kibana控制台,具体操作如下:

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


选择分词器算法Analyzer: ​​ik_smart​​, ​​ik_max_word​​,测试使用分词器:

GET /_analyze
{
"analyzer": "ik_smart",
"text": "测试使用分词器。"
}

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


更新 IK 分词:扩展字典&扩展停止词字典(不为其创建词条的词,如:的、啊等。)
分词器配置文件目录:​​/var/lib/docker/volumes/es-plugins/_data/ik/config​​。

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】



五、索引库操作

  • 1、mapping映射属性
  • type:字段数据类型,常见的简单类型有:
  • 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)
  • 数值:long、integer、short、byte、double、float、
  • 布尔:boolean
  • 日期:date
  • 对象:object
  • index:是否创建索引,默认为true
  • analyzer:使用哪种分词器
  • properties:该字段的子字段
  • 2、索引库CRUD


  • 创建索引库和映射
    ​PUT /<index>​


PUT /test
{
"mappings": {
"properties": {
"field1": { "type": "text" }
}
}
}

比如,创建以上先前案例的索引(​​ES索引​​:类似​​数据库中表​​的概念)。


PUT /tb_mobile
{
"mappings": {
"properties": {
"id":{
"type": "integer"
},
"title":{
"type": "text", # 可分词的文本字符串类型
"analyzer": "ik_max_word" # 分词算法
},
"price":{
"type": "double"
}
}
}
}
  • 查询索引库
    ​GET /<target>​


GET /tb_mobile
  • 修改索引库
    ​PUT /<target>/_mapping​​,注意原则上不允许修改已存在的索引库的映射,但是可以新增

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】


PUT /tb_mobile/_mapping
{
"properties": {
"note": {
"type": "keyword"
}
}
}
  • 删除索引库
    ​DELETE /<index>​


DELETE /tb_mobile

六、文档操作

  • 新增文档
    ​POST /<target>/_doc/<_id>​​:新增文档,已存在则覆盖(可理解为更新);
    ​POST /<target>/_create/<_id>​​:新增文档,已存在则报错,​​"version_conflict_engine_exception"​​。


POST /tb_mobile/_doc/1
{
"id": 1,
"title": "华为手机",
"price": "5499"
}
  • 查询文档
    ​GET <index>/_doc/<_id>​​:查询完整文档,包含版本、序列号等;
    ​GET <index>/_source/<_id>​​:查询文档JSON存储的内容。


GET /tb_mobile/_doc/1
GET /tb_mobile/_source/1

【Elasticsearch-基础使用:倒排索引,ES, Kibana,分词器,索引库操作】

图左_doc右_source.png

  • 删除文档
    ​DELETE /<index>/_doc/<_id>​


DELETE /tb_mobile/_doc/3
  • 修改文档
    ​POST /<target>/_doc/<_id>​​:新增文档,已存在则覆盖(可理解为更新);
    ​POST /<index>/_update/<_id>​​:局部更新,仅更新指定部分。


POST /tb_mobile/_doc/3
{
"id": 3,
"title": "小米手机",
"price": 4999
}

POST /tb_mobile/_update/3
{
"doc": {
"price": 4499
}
}


七、结尾

以上即为Elasticsearch-基础使用的全部内容