零、本文綱要
一葫哗、認(rèn)識(shí)Elasticsearch
二缔刹、倒排索引
三、ES的部分概念
四劣针、安裝ES校镐、Kibana、分詞器
五捺典、索引庫操作
六鸟廓、文檔操作
tips:Ctrl + F 搜索所需內(nèi)容快速閱讀吧。
一、認(rèn)識(shí)Elasticsearch
Elasticsearch:官方分布式搜索和分析引擎 | Elastic
- 1引谜、Lucene
Lucene是Apache的開源搜索引擎類庫牍陌,提供了搜索引擎的核心API,Elasticsearch底層是基于Lucene來實(shí)現(xiàn)的员咽。
- 2毒涧、Elasticsearch
Elasticsearch是一個(gè)開源的分布式搜索引擎,可以用來實(shí)現(xiàn)搜索贝室、日志統(tǒng)計(jì)契讲、分析、系統(tǒng)監(jiān)控等功能档玻。
- 3怀泊、Elastic Stack
Elastic Stack是以Elasticsearch為核心的技術(shù)棧,包括Beats误趴、Logstash、Kibana务傲、Elasticsearch凉当。
二、倒排索引
- 1售葡、倒排索引
倒排索引的概念是基于MySQL這樣的正向索引而言的看杭。
① 正向索引
如select * from tb_goods where title like %華為%
,過程如下:
- Ⅰ 搜索數(shù)據(jù)挟伙,條件是title符合
%華為%
楼雹; - Ⅱ 逐行獲取數(shù)據(jù),如id為1的數(shù)據(jù)尖阔;
- Ⅲ 判斷數(shù)據(jù)中title是否符合條件贮缅;
- Ⅳ 符合條件放入結(jié)果集,反之丟棄介却;
- Ⅴ 重復(fù)過程
Ⅰ - Ⅳ
直至逐行搜索結(jié)束谴供。
② 倒排索引
兩個(gè)重要概念:
Ⅰ 文檔
:用來搜索的數(shù)據(jù),其中的每一條數(shù)據(jù)就是一個(gè)文檔齿坷,相當(dāng)于MySQL中row桂肌。
Ⅱ 詞條
:對(duì)文檔數(shù)據(jù)或用戶搜索數(shù)據(jù),利用某種算法分詞永淌,得到的具備含義的詞語就是詞條崎场,例如:華為手機(jī)
,拆分為華為
遂蛀、手機(jī)
谭跨。
創(chuàng)建倒排索引:
- Ⅰ 將每一個(gè)文檔的數(shù)據(jù)利用分詞算法分詞,得到一個(gè)個(gè)詞條;
- Ⅱ 創(chuàng)建表饺蚊,每行數(shù)據(jù)包括詞條萍诱、詞條所在文檔id、位置等信息污呼;
- Ⅲ 根據(jù)詞條唯一性裕坊,可以給詞條創(chuàng)建索引,例如hash表結(jié)構(gòu)索引燕酷。
不難發(fā)現(xiàn)籍凝,Elasticsearch其實(shí)是以空間換時(shí)間
,通過創(chuàng)建倒排索引的方式來提升查詢效率苗缩。
同樣的語句select * from tb_goods where title like %華為%
饵蒂,搜索過程如下:
- Ⅰ 用戶輸入條件
華為
進(jìn)行搜索; - Ⅱ 對(duì)用戶條件進(jìn)行分詞酱讶,得到
華為
退盯; - Ⅲ 按照詞條'華為',到倒排索引中查找泻肯,得到文檔id:1渊迁、2;
- Ⅳ 根據(jù)id到正向索引中找到具體文檔灶挟。
三琉朽、ES的部分概念
- 1、文檔和字段
Elasticsearch是面向文檔(Document)
存儲(chǔ)的稚铣,可以是數(shù)據(jù)庫中的一條商品數(shù)據(jù)箱叁,一個(gè)訂單信息。文檔數(shù)據(jù)會(huì)被序列化為json格式后存儲(chǔ)在Elasticsearch中:
Json文檔中往往包含很多的字段(Field)惕医,類似于數(shù)據(jù)庫中的列耕漱。
- 2、索引和映射
索引(Index)
曹锨,就是相同類型的文檔的集合
孤个,如:用戶文檔、商品文檔等沛简∑肜穑可以把索引當(dāng)做是數(shù)據(jù)庫中的表
。
數(shù)據(jù)庫的表會(huì)有約束信息椒楣,用來定義表的結(jié)構(gòu)给郊、字段的名稱、類型等信息捧灰。因此淆九,索引庫中就有映射(mapping)
统锤,是索引中文檔的字段約束信息
,類似表的結(jié)構(gòu)約束炭庙。
- 3饲窿、MySQL和Elasticsearch
MySQL
:擅長事務(wù)類型操作,可以確保數(shù)據(jù)的安全和一致性焕蹄;
Elasticsearch
:擅長海量數(shù)據(jù)的搜索逾雄、分析、計(jì)算腻脏。
所以鸦泳,實(shí)際使用時(shí)可以將對(duì)安全性要求較高的寫操作,使用MySQL實(shí)現(xiàn)
永品,對(duì)查詢性能要求較高的搜索需求做鹰,使用Elasticsearch實(shí)現(xiàn)
。
四鼎姐、安裝ES钾麸、Kibana、分詞器
- 1症见、創(chuàng)建網(wǎng)絡(luò)
創(chuàng)建網(wǎng)絡(luò)喂走,用于容器間互聯(lián)。
docker network create es-net
- 2谋作、加載鏡像
此處需要注意,elasticsearch:8.1.0
和kibana:8.1.0
兩個(gè)版本要一致乎芳。
docker pull elasticsearch:8.1.0
docker pull kibana:8.1.0
- 3遵蚜、部署運(yùn)行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的數(shù)據(jù)目錄
-v es-plugins:/usr/share/elasticsearch/plugins \ # 掛載邏輯卷奈惑,綁定es的插件目錄
--privileged \ # 授予邏輯卷訪問權(quán)
elasticsearch:8.1.0
- 4吭净、部署運(yùn)行Kibana
docker run -d \
--name kibana \
--net es-net \ # 與Elasticsearch加入同一個(gè)網(wǎng)絡(luò)
-e ELASTICSEARCH_HOSTS=http://es:9200 \ # 設(shè)置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/
- Kibana:
http://192.168.253.128:5601/
- 6原在、安裝分詞器
① 查看數(shù)據(jù)卷目錄
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容器的插件數(shù)據(jù)卷中
插件數(shù)據(jù)卷目錄:/var/lib/docker/volumes/es-plugins/_data
下載分詞器:IK分詞器GitHub地址:https://github.com/medcl/elasticsearch-analysis-ik
③ 重啟ES容器使其生效
docker restart es
- 7友扰、使用分詞器
打開Kibana控制臺(tái),具體操作如下:
選擇分詞器算法Analyzer: ik_smart
, ik_max_word
庶柿,測試使用分詞器:
GET /_analyze
{
"analyzer": "ik_smart",
"text": "測試使用分詞器村怪。"
}
更新 IK 分詞:擴(kuò)展字典&擴(kuò)展停止詞字典(不為其創(chuàng)建詞條的詞,如:的浮庐、啊等甚负。)
分詞器配置文件目錄:/var/lib/docker/volumes/es-plugins/_data/ik/config
。
更新配置后,重啟服務(wù)即可生效梭域。命令如下:
# 重啟服務(wù)
docker restart elasticsearch
docker restart kibana
五斑举、索引庫操作
- 1、mapping映射屬性
- type:字段數(shù)據(jù)類型病涨,常見的簡單類型有:
- 字符串:text(可分詞的文本)富玷、keyword(精確值,例如:品牌没宾、國家凌彬、ip地址)
- 數(shù)值:long、integer循衰、short铲敛、byte、double会钝、float伐蒋、
- 布爾:boolean
- 日期:date
- 對(duì)象:object
- index:是否創(chuàng)建索引,默認(rèn)為true
- analyzer:使用哪種分詞器
- properties:該字段的子字段
- 2迁酸、索引庫CRUD
索引庫操作的官方文檔:Index APIs | Elasticsearch Guide [7.12] | Elastic先鱼。
- 創(chuàng)建索引庫和映射
PUT /<index>
PUT /test
{
"mappings": {
"properties": {
"field1": { "type": "text" }
}
}
}
比如,創(chuàng)建以上先前案例的索引(ES索引
:類似數(shù)據(jù)庫中表
的概念)奸鬓。
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
焙畔,注意原則上不允許修改已存在的索引庫的映射,但是可以新增串远。
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>
:新增文檔伸但,已存在則報(bào)錯(cuò),"version_conflict_engine_exception"
留搔。
POST /tb_mobile/_doc/1
{
"id": 1,
"title": "華為手機(jī)",
"price": "5499"
}
- 查詢文檔
GET <index>/_doc/<_id>
:查詢完整文檔更胖,包含版本、序列號(hào)等隔显;
GET <index>/_source/<_id>
:查詢文檔JSON存儲(chǔ)的內(nèi)容却妨。
GET /tb_mobile/_doc/1
GET /tb_mobile/_source/1
- 刪除文檔
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": "小米手機(jī)",
"price": 4999
}
POST /tb_mobile/_update/3
{
"doc": {
"price": 4499
}
}
七哺窄、結(jié)尾
以上即為Elasticsearch-基礎(chǔ)使用的全部內(nèi)容捐下,感謝閱讀账锹。