Elasticsearch-基础使用

零、本文纲要

一、认识Elasticsearch
二、倒排索引
三、ES的部分概念
四、安装ES、Kibana、分词器
五、索引库操作
六、文档操作

tips:Ctrl + F 搜索所需内容快速阅读吧。

一、认识Elasticsearch

Elasticsearch:官方分布式搜索和分析引擎 | Elastic

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

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

创建倒排索引:

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

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

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

三、ES的部分概念

  • 1、文档和字段

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

图中右边理解为文档.png

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

  • 2、索引和映射

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

约束-映射.png
  • 3、MySQL和Elasticsearch

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

image.png

四、安装ES、Kibana、分词器

  • 1、创建网络

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

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

此处需要注意,elasticsearch:8.1.0kibana: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/
ES.png
  • Kibana:http://192.168.253.128:5601/
Kibana.png
  • 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
下载分词器:IK分词器GitHub地址:https://github.com/medcl/elasticsearch-analysis-ik

③ 重启ES容器使其生效

docker restart es
  • 7、使用分词器

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

Kibana控制台.png

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

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

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

更新IK分词.png

更新配置后,重启服务即可生效。命令如下:

# 重启服务
docker restart elasticsearch
docker restart kibana

五、索引库操作

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

索引库操作的官方文档:Index APIs | Elasticsearch Guide [7.12] | Elastic

  • 创建索引库和映射
    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,注意原则上不允许修改已存在的索引库的映射,但是可以新增
image.png
PUT /tb_mobile/_mapping
{
  "properties": {
    "note": {
      "type": "keyword"
    }
  }
}
  • 删除索引库
    DELETE /<index>
DELETE /tb_mobile

六、文档操作

文档操作的官方文档:Document APIs | Elasticsearch Guide [7.12] | Elastic

  • 新增文档
    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
图左_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-基础使用的全部内容,感谢阅读。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容