目錄
一、全文搜索
1,數(shù)據(jù)分類
2,搜索分類:
3,什么是全文搜索
全文檢索是指:
倒排索引
二、ElasticSearch簡介
1,ElasticSearch是什么
2,ElasticSearch特點:
3,ElasticSearch版本特性:
4,Elastic生態(tài)圈--Elastic Stack介紹
5,ElasticSearch應(yīng)用場景
6,ElasticSearch單機(jī)版部署安裝
1,環(huán)境準(zhǔn)備
2,下載elasticsearch壓縮包(Linux版本)
3,創(chuàng)建es用戶
4,修改參數(shù)
?5,配置主機(jī)名,重啟系統(tǒng)
6,解壓ES安裝包
7,配置Java環(huán)境變量
8,修改目錄所屬屬組
9,修改ElasticSearch的配置文件。
10,切換用戶
11,啟動elasticsearch服務(wù)
12,設(shè)置es安全訪問的密碼
13,驗證
?7,客戶端Kibana部署安裝
1,下載kibana安裝包。
2,解壓kibana tar包至es目錄下
3,設(shè)置kibana-7.13.4-linux-x86_64目錄的所屬用戶和所屬組為es。
4,修改kibana配置文件~
5,啟動kibana服務(wù)并驗證是否啟動成功
三、ElasticSearch使用操作
1,ElasticSearch常用cat API
2,Elasticsearch安裝插件
1,)離線安裝ik分詞器。
2,)在線安裝icu分詞器。
3,)使用分詞器測試分詞效果
?3,Elasticsearch索引操作
4,ElasticSearch基本概念
5,ElasticSearch文檔操作
1,添加文檔
2,修改文檔?
?3,查詢文檔
4,刪除文檔操作?
5,ElasticSearch文檔批量寫入操作
6,ES檢索原理分析
索引的原理
磁盤IO與預(yù)讀
倒排索引
四,Python讀取excel數(shù)據(jù)批量寫入ES文檔數(shù)據(jù)
一、全文搜索
1,數(shù)據(jù)分類
結(jié)構(gòu)化數(shù)據(jù):固定格式,有限長度,比如數(shù)據(jù)庫(MySQL,PostgreSQL)存的數(shù)據(jù)
非結(jié)構(gòu)化數(shù)據(jù):不定長,無固定格式? ? ?比如郵件,word文檔,日志
半結(jié)構(gòu)化數(shù)據(jù):前兩者結(jié)合。比如xml,html網(wǎng)頁
2,搜索分類:
結(jié)構(gòu)化數(shù)據(jù)搜索:使用關(guān)系型數(shù)據(jù)庫
非結(jié)構(gòu)化數(shù)據(jù)搜索:
- 順序掃描
- 全文檢索
設(shè)想一個關(guān)于搜索的場景,假設(shè)要搜索一首詩句內(nèi)容中帶有“前”字的古詩
name | content | author |
靜夜思 | 床前明月光,疑是地上霜,舉頭望明月,低頭思故鄉(xiāng) | 李白 |
望廬山瀑布 | 日照香爐生紫煙,遙看瀑布掛前川。飛流直下三千尺,疑是銀河落九天 | 李白 |
... | ... | ... |
如果使用數(shù)據(jù)庫的SQL來存儲古詩的話,應(yīng)使用這樣的SQL查詢
select name from poems where content like "%前%";
這種使用SQL查詢的方式稱為順序掃描法,需要遍歷所有的記錄進(jìn)行匹配,不但效率低,而且不符合我們搜索時的期望數(shù)據(jù)~
所以,采用es的全文檢索的方式,可以大幅提升我們搜索數(shù)據(jù)的效率~
3,什么是全文搜索
全文檢索是指:
-
通過一個程序掃描文本中的每一個單詞,針對單詞建立索引,并保存該單詞在文本中的位置,以及出現(xiàn)的次數(shù)
-
用戶查詢時,通過之前建立好的索引來查詢,將索引中單詞對應(yīng)的文本位置,出現(xiàn)的次數(shù)返回給用戶,因為有了具體文本的位置,所以就可以將具體內(nèi)容讀取出來了
示例:csdn搜索關(guān)鍵詞查找對應(yīng)信息
如上圖,如果使用SQL的模糊匹配,則搜索結(jié)果對應(yīng)應(yīng)該是包含“nightingale部署使用”這個關(guān)鍵字的信息才會被匹配出來。
而根據(jù)上圖搜索匹配出來的結(jié)果看,顯然不是通過模糊匹配來搜索的。首先根據(jù)搜索出來的結(jié)果看,此搜索操作是被分詞后的了,所以無論是匹配到nightingale部署,還是匹配到nightingale使用等其他一些關(guān)鍵詞,都會匹配搜索出結(jié)果來。包括文章中出現(xiàn)對應(yīng)分詞的信息,也會被高亮顯示出來~
簡單理解搜索步驟原理主要概況為以下幾個步驟:
-
內(nèi)容爬取,停頓詞過濾比如一些無用的像“的”,“了” 之類的語氣詞/連接詞
-
內(nèi)容分詞,提取關(guān)鍵詞
-
根據(jù)關(guān)鍵詞建立倒排索引
-
用戶輸入關(guān)鍵詞進(jìn)行搜索
倒排索引
索引就類似于目錄,平時我們使用的索引,都是通過主鍵定位到某條數(shù)據(jù),那么倒排索引,剛好相反,數(shù)據(jù)對應(yīng)到主鍵
示例圖:
這里以一個博客文章的內(nèi)容舉例,來查看正排索引和倒排索引的區(qū)別~
正排索引(正向索引)
文章ID | 文章標(biāo)題 | 文章內(nèi)容 |
---|---|---|
1 | 淺析JAVA設(shè)計模式 | JAVA設(shè)計模式是每一個JAVA程序員都應(yīng)該掌握的進(jìn)階知識 |
2 | JAVA多線程設(shè)計模式 | JAVA多線程與設(shè)計模式結(jié)合 |
如上表格,正排索引可以根據(jù)主鍵id對應(yīng)查詢文章標(biāo)題和文章內(nèi)容
倒排索引(反向索引)
關(guān)鍵詞 | 文章ID |
---|---|
JAVA | 1,2 |
設(shè)計模式 | 1,2 |
多線程 | 2 |
假如,我們有一個站內(nèi)搜索的功能,通過某個關(guān)鍵詞來搜索相關(guān)的文章,那么這個關(guān)鍵詞可能出現(xiàn)在標(biāo)題中,也可能出現(xiàn)在文章內(nèi)容中,那我們將會在創(chuàng)建或修改文章的時候,建立一個關(guān)鍵詞與文章的對應(yīng)關(guān)系表,這種,我們可以稱之為倒排索引。
總結(jié):
-
倒排索引:是數(shù)據(jù)關(guān)鍵詞對應(yīng)主鍵
-
正排索引:主鍵對應(yīng)具體數(shù)據(jù)
二、ElasticSearch簡介
1,ElasticSearch是什么
ElasticSearch(簡稱ES)是一個分布式、RESTful風(fēng)格的搜索和數(shù)據(jù)分析引擎,是用Java開發(fā)并開源的企業(yè)級搜索引擎,能夠達(dá)到近實時搜索,穩(wěn)定,可靠,快速,安裝使用方便。
客戶端Java、.NET(c#)、PHP、Python、Ruby等多種語言。
官方網(wǎng)站:Elasticsearch Platform — Find real-time answers at scale | Elastic
下載地址:Download Elasticsearch | Elastic
2,ElasticSearch特點:
-
支持分布式,可水平擴(kuò)展
-
降低全文檢索的學(xué)習(xí)曲線,可以被任何編程語言調(diào)用
-
分片與副本機(jī)制,直接解決了集群下性能與高可用問題。
3,ElasticSearch版本特性:
5.x新特性:
-
默認(rèn)打分機(jī)制從TF-IDF改為BM25
-
內(nèi)部引擎移除了避免同一文檔并發(fā)更新的競爭鎖,帶來15%~20%的性能提升
-
Instant aggregation支持分片,上聚合的緩存
-
新增了Profile API
6.x新特性:
-
跨集群復(fù)制(CCR)
-
索引生命周期管理
-
SQL的支持
-
更友好的升級和數(shù)據(jù)遷移
-
在主要版本之間的遷移更為簡化;
-
全新的基于操作的數(shù)據(jù)復(fù)制框架,可加快恢復(fù)數(shù)據(jù);
-
-
性能優(yōu)化
-
有效存儲稀疏字段的新方法,降低了存儲成本
-
在索引時進(jìn)行排序,可加快排序的查詢性能
-
7.x新特性:
重大改進(jìn):正式廢除單個索引下多Type的支持
7.1開始,Security功能免費使用
ECK-Elasticsearch Operator on kubernetes
新功能
-
New Cluster coordination
-
Feature--Complete High Level REST Client
-
Script Score Query
性能優(yōu)化
-
默認(rèn)的Primary Shard數(shù)從5改為1,避免Over Sharding
-
性能優(yōu)化,更快的Top K
8.x新特性:
-
Rest API相比較7.x而言做了比較大的改動(比如徹底刪除type)
-
默認(rèn)開啟安全配置
-
存儲空間優(yōu)化:對倒排文件使用新的編碼集,對于keyword、match_only_text類型字段有效,有3.5%的空間優(yōu)化提升,對于新建索引和segment自動生效
-
優(yōu)化geo_point,geo_shape類型的索引(寫入)效率:15%的提升
-
技術(shù)預(yù)覽版KNN API發(fā)布,(K鄰近算法),跟推薦系統(tǒng)、自然語言排名相關(guān)。
4,Elastic生態(tài)圈--Elastic Stack介紹
首先,我們經(jīng)常說的日志搜集分析系統(tǒng)ELK系統(tǒng)分別是Elasticsearch,Logstash,Kibana三款軟件的簡稱,在發(fā)展的過程中又有新的成員Beats的加入,就形成了Elastic Stack。
?指標(biāo)分析/日志分析
-
利用Java程序或beats搜集各種中間件、或Java程序的日志;
-
將搜集到的日志數(shù)據(jù)寫入到redis、或kafka、rabbitmq等各種mq消息隊列中;
-
利用logstash對收集到的日志做過濾(數(shù)據(jù)分析,將主要報錯或一些重要字段數(shù)據(jù)取出),并將數(shù)據(jù)轉(zhuǎn)為json格式;
-
logstash將數(shù)據(jù)處理完成后,將數(shù)據(jù)持久化存儲到elasticsearch中;
-
最后,使用可視化工具kibana或Grafana將數(shù)據(jù)可視化展示;
-
另外,可以配置使用nginx做一些安全策略(如限制ip訪問等~)
5,ElasticSearch應(yīng)用場景
-
站內(nèi)搜索
-
日志管理和分析
-
大數(shù)據(jù)分析
-
應(yīng)用性能監(jiān)控
-
機(jī)器學(xué)習(xí)
6,ElasticSearch單機(jī)版部署安裝
1,環(huán)境準(zhǔn)備
-
操作系統(tǒng):CentOS7.6
-
CPU:1核1G
-
內(nèi)存:4G
-
軟件版本:elasticsearch-7.13.4
注意:不同版本的es所需環(huán)境不同,es5需要安裝java環(huán)境,需要jdk8以上的版本;
es從6.5開始支持java11,es從7.0開始,內(nèi)置了java環(huán)境 ~~~
2,下載elasticsearch壓縮包(Linux版本)
[root@ecs-69416390 ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-linux-x86_64.tar.gz
3,創(chuàng)建es用戶
在Linux中添加一個普通用戶:es 【目前ES不支持root用戶啟動】
[root@ecs-69416390 ~]# useradd -d /es -m es #創(chuàng)建es用戶并生成es用戶的家目錄
[root@ecs-69416390 ~]# passwd es #設(shè)置es用戶的登錄密碼
4,修改參數(shù)
修改Linux中最大文件描述符以及最大虛擬內(nèi)存的參數(shù)。
因為ES對Linux的最大文件描述符以及最大虛擬內(nèi)存有一定要求,所以需要修改。否則ES無法正常啟動。
[root@localhost ~]# vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
?修改最大虛擬內(nèi)存
[root@localhost ~]# vi /etc/sysctl.conf
vm.max_map_count=262144
?5,配置主機(jī)名,重啟系統(tǒng)
配置主機(jī)名,重啟Linux系統(tǒng)。
前面修改的Linux的一些系統(tǒng)參數(shù)需要重啟系統(tǒng)后才會生效。
[root@localhost ~]# hostnamectl set-hostname elasticsearch01
[root@elasticsearch01 ~]# vi /etc/hosts
...
...
192.168.48.201 elasticsearch01
[root@localhost ~]# reboot -h now
6,解壓ES安裝包
解壓ES安裝包到es用戶的家目錄下面。
[root@localhost ~]# tar -zxvf elasticsearch-7.13.4-linux-x86_64.tar.gz
[root@localhost ~]# mv elasticsearch-7.13.4/ /es/
7,配置Java環(huán)境變量
在profile文件中配置ES_JAVA_HOME環(huán)境變量,指向ES中內(nèi)置的JDK。
[root@localhost ~]# vi /etc/profile
...
export ES_JAVA_HOME=/es/elasticsearch-7.13.4/jdk/
export PATH=$PATH:$ES_JAVA_HOME/bin
...
[root@localhost ~]# source /etc/profile
8,修改目錄所屬屬組
修改elasticsearch-7.13.4目錄所屬的屬組。
因為前面是使用root用戶解壓的,elasticsearch-7.13.4目錄下的文件es用戶是沒有權(quán)限的。
[root@localhost ~]# chown -R es:es /es/elasticsearch-7.13.4/
9,修改ElasticSearch的配置文件。
[root@localhost ~]# vi /es/elasticsearch-7.13.4/config/elasticsearch.yml
...
# ---------------------------------- Cluster -----------------------------------
...
cluster.name: comment-es
# 集群名稱
...
# ------------------------------------ Node ------------------------------------
...
node.name: node-1
# 節(jié)點名稱
...
# ---------------------------------- Network -----------------------------------
network.host: 192.168.26.10
# 為ES設(shè)置綁定的IP
http.port: 9200
# 為ES服務(wù)設(shè)置監(jiān)聽的端口
...
# --------------------------------- Discovery ----------------------------------
cluster.initial_master_nodes: ["node-1"]
# 初始化具備主節(jié)點資格的節(jié)點,在選擇主節(jié)點時,會優(yōu)先在這一批列表中進(jìn)行選擇
...
# ---------------------------------- Various -----------------------------------
...
xpack.security.enabled: true #開啟安全策略
xpack.security.transport.ssl.enabled: true #開啟安全策略
10,切換用戶
切換到es用戶
[root@localhost ~]# su es
11,啟動elasticsearch服務(wù)
(1.)前臺啟動ES服務(wù)
[es@elasticsearch01 elasticsearch-7.13.4]$ bin/elasticsearch
(2.)后臺啟動ES服務(wù)
在實際生產(chǎn)環(huán)境中,需要將ES放到后臺運行。
[es@elasticsearch01 elasticsearch-7.13.4]$ bin/elasticsearch -d
12,設(shè)置es安全訪問的密碼
此處密碼設(shè)置均自定義設(shè)置,即執(zhí)行命令后根據(jù)提示輸入密碼即可。
[es@elasticsearch01 elasticsearch-7.13.4]$ ./bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
13,驗證
驗證ES服務(wù)。
通過jps命令或者jcmd命令驗證進(jìn)程是否存在。
[es@elasticsearch01 elasticsearch-7.13.4]$ jps
1314 Elasticsearch
8786 Jps
[es@elasticsearch01 elasticsearch-7.13.4]$ jcmd
8800 jdk.jcmd/sun.tools.jcmd.JCmd
1314 org.elasticsearch.bootstrap.Elasticsearch
通過web界面訪問驗證是否可以正常訪問。
http://192.168.26.10:9200/
到此,ElasticSearch部署完成 ~~~
?7,客戶端Kibana部署安裝
Kibana是一個開源分析和可視化平臺,旨在與ElasticSearch協(xié)同工作。
1,下載kibana安裝包。
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.13.4-linux-x86_64.tar.gz
# 注意:安裝的kibana客戶端的版本必須和elasticsearch的版本完全一致~
# 官網(wǎng)下載慢可以使用華為云鏡像下載:https://mirrors.huaweicloud.com/home
2,解壓kibana tar包至es目錄下
[root@elasticsearch01 ~]# tar -zxvf kibana-7.13.4-linux-x86_64.tar.gz -C /es/
3,設(shè)置kibana-7.13.4-linux-x86_64目錄的所屬用戶和所屬組為es。
[root@elasticsearch01 es]# chown -R es:es kibana-7.13.4-linux-x86_64/
4,修改kibana配置文件~
[root@elasticsearch01 kibana-7.13.4-linux-x86_64]# vi config/kibana.yml
...
server.port: 5601
# kibana服務(wù)端口
...
server.host: "192.168.26.10"
...
elasticsearch.hosts: ["http://192.168.26.10:9200"]
...
elasticsearch.username: "elastic" #此處為明文配置的es密碼
elasticsearch.password: "自定義的elastic密碼"
...
xpack.reporting.encryptionKey: "a_random_string"
xpack.security.encryptionKey: "something_at_least_32_characters"
...
i18n.locale: "zh-CN"
5,啟動kibana服務(wù)并驗證是否啟動成功
[es@elasticsearch01 kibana-7.13.4-linux-x86_64]$ nohup ./bin/kibana &
[root@elasticsearch01 kibana-7.13.4-linux-x86_64]# netstat -uptln |grep 5601
tcp 0 0 192.168.26.10:5601 0.0.0.0:* LISTEN 18982/node
通過瀏覽器訪問 http://192.168.26.10:5601/login?next=%2F 驗證kibana服務(wù)
?輸入用戶名密碼:elastic,elastic
三、ElasticSearch使用操作
1,ElasticSearch常用cat API
/_cat/allocation # 查看單節(jié)點的$hard分配整體情況
/_cat/shards # 查看各shard的詳細(xì)情況
/_cat/shards/{index} # 查看指定分片的詳細(xì)情況
# 示例:GET /_cat/shards/.kibana-event-log-7.13.4-000001
/_cat/master # 查看master節(jié)點信息
/_cat/nodes # 查看所有節(jié)點信息
/_cat/indices # 查看集群中所有index的詳細(xì)信息
/_cat/indices/{index} # 查看集群中指定index的詳細(xì)信息
# 示例:GET /_cat/indices/.tasks
/_cat/segments # 查看各index的segment詳細(xì)信息,包括segment名,所屬shard,內(nèi)存(磁盤)占用大小等
/_cat/segments/{index} # 查看指定index的segment詳細(xì)信息
/_cat/count # 查看當(dāng)前集群的doc數(shù)量
/_cat/count/{index} # 查看指定索引的doc數(shù)量
/_cat/recovery # 查看集群內(nèi)每個shard的recovery過程,調(diào)整replica。
/_cat/recovery/{index} # 查看指定索引$hard的recovery過程
/_cat/health # 查看集群當(dāng)前狀態(tài):紅、黃、綠
/_cat/pending_tasks # 查看當(dāng)前集群的pending task
/_cat/aliases # 查看集群中所有alias信息,路由配置等
/_cat/aliases/{alias} # 查看指定索引的alias信息
/_cat/thread_pool # 查看集群各節(jié)點內(nèi)部不同類型的threadpool的統(tǒng)計信息
/_cat/plugins # 查看集群各個節(jié)點上的plugin信息
/_cat/fielddata # 查看當(dāng)前集群各個節(jié)點的fielddata內(nèi)存使用情況
/_cat/fielddata/{fields} # 查看指定field的內(nèi)存使用情況
/_cat/nodeattrs # 查看單節(jié)點的自定義屬性
/_cat/repositories # 輸出集群中組測快照存儲庫
/_cat/templates # 輸出當(dāng)前正在存在的模板信息
2,Elasticsearch安裝插件
安裝分詞器插件,這里安裝ik分詞器插件和icu分詞器插件。
1,)離線安裝ik分詞器。
本地下載相應(yīng)的插件,解壓。然后手動上傳到elasticsearch的plugins目錄,然后重啟ES示例就可以了
比如安裝ik中文分詞插件:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.
[root@elasticsearch01 ~]# cd /es/elasticsearch-7.13.4/plugins/
[root@elasticsearch01 plugins]# mkdir ik && cd ik
[root@elasticsearch01 plugins]# unzip elasticsearch-analysis-ik-7.13.4.zip
[root@elasticsearch01 plugins]# rm -rf elasticsearch-analysis-ik-7.13.4.zip
2,)在線安裝icu分詞器。
# 查看已安裝插件
[es@elasticsearch01 elasticsearch-7.13.4]$ bin/elasticsearch-plugin list
# 安裝插件
[es@elasticsearch01 elasticsearch-7.13.4]$ bin/elasticsearch-plugin install analysis-icu
# 刪除插件
[es@elasticsearch01 elasticsearch-7.13.4]$ bin/elasticsearch-plugin remove analysis-icu
注意:安裝和刪除完插件后,需要重啟ES服務(wù)才能生效。
# 殺掉es進(jìn)程
[es@elasticsearch01 elasticsearch-7.13.4]$ kill 9387
# 重啟es服務(wù)
[es@elasticsearch01 elasticsearch-7.13.4]$ ./bin/elasticsearch -d
3,)使用分詞器測試分詞效果
icu分詞效果
POST _analyze
{
"analyzer": "icu_analyzer",
"text": "中華人民共和國"
}
?ik分詞效果
# 按最大詞組分詞
POST _analyze
{
"analyzer": "ik_max_word",
"text": "中華人民共和國"
}
# 按最少詞組分詞
POST _analyze
{
"analyzer": "ik_smart"
, "text": "中華人民共和國"
}
最大分詞:
最少分詞
?3,Elasticsearch索引操作
官網(wǎng)文檔地址:[Elasticsearch Guide 7.13] | Elastic
創(chuàng)建索引
索引命名必須小寫,不能以下劃線開頭
格式:PUT /索引名稱
# 創(chuàng)建索引
PUT /es_db
# 創(chuàng)建成功后返回:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "es_db"
}
# 創(chuàng)建索引時可以設(shè)置分片數(shù)和副本數(shù)
# 如果有多個elasticsearch節(jié)點,可以設(shè)置多個分片,比如如果有3個節(jié)點,可以指定設(shè)置3個分片,將索引數(shù)據(jù)分成3分放到3個節(jié)點上。
PUT /es_db
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
# 修改索引配置
PUT /es_db/_settings
{
"index" : {
"number_of_replicas" : 1
}
}
查詢索引
格式:GET /索引名稱
# 查詢索引
GET /es_db
# 查詢后輸出一些信息:
{
"es_db" : {
"aliases" : { }, # 索引別名
"mappings" : { }, # 映射,索引有數(shù)據(jù)之后 會存放數(shù)據(jù)類型~
"settings" : { # 設(shè)置
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1", # 索引分片
"provided_name" : "es_db", # 索引名稱
"creation_date" : "1680163838332", # 創(chuàng)建時間
"number_of_replicas" : "1", # 副本
"uuid" : "tfWi352WT9WvvhriwslZqA",
"version" : {
"created" : "7130499"
}
}
}
}
}
# es_db索引是否存在
HEAD /es_db
刪除索引
格式:DELETE /索引名稱
DELETE /es_db
4,ElasticSearch基本概念
ElasticSearch與傳統(tǒng)關(guān)系型數(shù)據(jù)庫的區(qū)別:
-
Elasticsearch Schemaless /相關(guān)性/高性能全文檢索
-
RDMS 事務(wù)性 / join?
索引(Index)
一個索引就是一個擁有相似特征的文檔的集合。一個索引由一個名字來標(biāo)識(必須全部是小寫字母),并且當(dāng)我們要對對應(yīng)這個索引中的文檔進(jìn)行索引、搜索、更新和刪除的時候,都要使用到這個名字。
{
"es_db" : {
"aliases" : { }, # 索引別名
"mappings" : { }, # 映射,索引有數(shù)據(jù)之后 會存放數(shù)據(jù)類型~
"settings" : { # 設(shè)置
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1", # 索引分片
"provided_name" : "es_db", # 索引名稱
"creation_date" : "1680163838332", # 創(chuàng)建時間
"number_of_replicas" : "1", # 副本
"uuid" : "tfWi352WT9WvvhriwslZqA",
"version" : {
"created" : "7130499"
}
}
}
}
}
文檔(Document)
-
Elasticsearch是面向文檔的,文檔是所有可搜索數(shù)據(jù)的最小單位。
-
日志文件中的日志項
-
一部電影的具體信息/一張唱片的詳細(xì)信息
-
MP3播放器里的一首歌/一篇PDF文檔中的具體內(nèi)容
-
-
文檔會被序列化成JSON格式,保存在Elasticsearch中
-
JSON對象由字段組成
-
每個字段都有對應(yīng)的字段類型(字符串/數(shù)值/布爾/日期/二進(jìn)制/范圍類型)
-
-
每個文檔都有一個Unique ID
-
可以自己指定ID或者通過Elasticsearch自動生成
-
-
一篇文檔包含了一系列字段,類似數(shù)據(jù)庫表中的一條記錄
-
JSON文檔,格式靈活,不需要預(yù)先定義格式
-
字段的類型可以指定或者通過Elasticsearch自動推算
-
支持?jǐn)?shù)組/支持嵌套
-
文檔元數(shù)據(jù)
元數(shù)據(jù),用于標(biāo)注文檔的相關(guān)信息:
_index:文檔所屬的索引名
_type:文檔所屬的類型名
_id:文檔唯一id
_source:文檔的原始json數(shù)據(jù)
version:文檔的版本號,修改刪除操作version都會自增
seq_no:和version一樣,一旦數(shù)據(jù)發(fā)生更改,數(shù)據(jù)也一直是累計的。Shard級別嚴(yán)格遞增,保證后寫入的Doc的seq_no大于先寫入的Doc的seq_no。
primory_term:primory_term主要是用來恢復(fù)數(shù)據(jù)時處理當(dāng)多個文檔的seq_no一樣時的沖突,避免Primary Shard上的寫入被覆蓋。每當(dāng)Primary Shard發(fā)生重新分配時,比如重啟,Primary選舉等,_primory_term會遞增1。
5,ElasticSearch文檔操作
1,添加文檔
- 格式:[PUT | POST /索引名稱/[_doc | _create ]/id
# 創(chuàng)建文檔,指定id
# 如果id不存在,創(chuàng)建新的文檔,否則先刪除現(xiàn)有文檔,再創(chuàng)建新的文檔,版本會增加
PUT /es_db/_doc/1
{
"name":"張三",
"sex":1,
"age":25,
"address":"廣州天河公園",
"remark":"java developer"
}
# 輸出:
{
"_index" : "es_db",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
# PUT方式創(chuàng)建文檔,它底層會根據(jù)id查看這條數(shù)據(jù)是否存在,如果存在則會刪除這條文檔,再新增(類似于全量更新操作),比如下面示例,將id為1的文檔修改。
PUT /es_db/_doc/1
{
"name":"張三xxx",
"address":"廣州天河公園",
"remark":"java developer"
}
# 輸出:可以看出此時version版本為2,result為update
{
"_index" : "es_db",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
# 查看新增的這條文檔數(shù)據(jù):
GET /es_db/_doc/1
# 輸出:
{
"_index" : "es_db",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "張三xxx",
"address" : "廣州天河公園",
"remark" : "java developer"
}
}
# 使用POST創(chuàng)建文檔,ES自動生成id
POST /es_db/_doc
{
"name":"張三",
"sex":1,
"age":25,
"address":"廣州天河公園",
"remark":"java developer"
}
# 使用POST修改文檔
POST /es_db/_doc/FuGtNYgBnLz27AmKfPQf
{
"name":"李四xxx",
"sex":1,
"age":26,
"address":"深圳金沙灣公園",
"remark":"java developer"
}
# 輸出:
{
"_index" : "es_db",
"_type" : "_doc",
"_id" : "FuGtNYgBnLz27AmKfPQf",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 4,
"_primary_term" : 1
}
總結(jié):POST和PUT都能起到創(chuàng)建/更新的作用,PUT需要對一個具體的資源進(jìn)行操作也就是要確定id才能進(jìn)行更新/創(chuàng)建;而POST是可以針對整個資源集合進(jìn)行操作的,如果不寫id就有ES生成一個唯一id進(jìn)行創(chuàng)建新文檔,如果填了id那就針對這個id的文檔進(jìn)行創(chuàng)建/更新
注意:語法中的_create語法,如果ID已經(jīng)存在,再使用create創(chuàng)建就會失敗。
一般_create語法用于多線程并發(fā)場景。
# 例如:針對es_db索引中id為1的文檔做新增操作。
POST /es_db/_create/1
{
"name":"李四xxx",
"address":"廣州天河公園",
"remark":"java developer"
}
接口報錯:提示該文檔已存在
2,修改文檔?
-
全量更新,整個json都會替換,格式:[PUT | POST]/索引名稱/_doc/id
如果文檔存在,現(xiàn)有文檔會被刪除,新的文檔會被索引
# 全量更新,替換整個json
PUT /es_db/_doc/1/
{
"name":"張三",
"sex":1,
"age":25
}
-
使用update部分更新,格式:POST /索引名稱/update/id
update不會刪除原來的文檔,而是實現(xiàn)真正的數(shù)據(jù)更新
# 部分更新:在原有文檔上更新
# Update - 文檔必須已經(jīng)存在,更新只會對相應(yīng)字段做增量修改
POST /es_db/_update/1
{"doc": {
"age":26,
"address":"北京工人體育廣場"
}
}
# 查看索引文檔
GET /es_db/_doc/1
# 輸出:
{
"_index" : "es_db",
"_type" : "_doc",
"_id" : "1",
"_version" : 5,
"_seq_no" : 7,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "張三",
"sex" : 1,
"age" : 26,
"address" : "北京工人體育廣場"
}
}
- ?使用_update_by_query更新文檔
POST /es_db/_update_by_query
{
"query": {
"match": {
"_id": "FuGtNYgBnLz27AmKfPQf"
}
},
"script": {
"source": "ctx._source.age = 30",
"lang": "painless"
}
}
根據(jù)id查看對應(yīng)文檔,age字段已更改
修改指定索引的name字段
?3,查詢文檔
- ?根據(jù)id查詢文檔,格式:GET /索引名稱/_doc/id
GET /es_db/_doc/1 # 查詢索引為1的文檔數(shù)據(jù)
- 條件查詢search,格式:GET /索引名稱/doc/_search,默認(rèn)查詢前10條文檔
# 查詢前10條文檔
GET /es_db/_doc/_search
ES Search API 提供了兩種條件查詢搜索方式:
-
REST風(fēng)格的請求URI,直接將參數(shù)帶過去
-
封裝到request body中,這種方式可以定義更加易讀的JSON格式
# search條件查詢
1,)term精確查找文檔數(shù)據(jù)
GET /es_db/_search
{
"query": {
"term": {
"name": {
"value": "張三" # 查詢name字段是張三的索引文檔
}
}
}
}
# 使用match查詢address中有工人體育的索引文檔
GET /es_db/_search
{
"query": {
"match": {
"address": "工人體育"
}
}
}
?常用search條件查詢
# 通過URI搜索,使用"q"指定查詢字符串,"query string syntax" KV鍵值對
# 條件查詢,如果查詢age等于25歲的 _search?q=*:***
GET /es_db/_search?q=age:25
# 范圍查詢,如果查詢的age在25歲至27歲之間的,_search?q=***[** TO **] 注意:TO 必須為大寫
GET /es_db/_search?q=age[25 TO 27]
# 查詢年齡小于等于27歲的 :<=
GET /es_db/_search?q=age:<=27
# 查詢年齡大于27歲的 :>
GET /es_db/_search?q=age:>27
# 分頁查詢 from=*&size=*
GET /es_db/_search?q=age[25 TO 28]&from=0&size=1 # 從第一頁(索引0)開始,每頁展示1條數(shù)據(jù)
# 對查詢結(jié)果只輸出某些字段 _source=字段,字段
GET /es_db/_search?_source=name,age,remark # 只查詢名稱,年齡,職業(yè)
# 對查詢結(jié)果排序 sort=字段:desc/asc
GET /es_db/_doc/_search?sort=age:desc
- ES Search API 提供了SQL查詢方式,可以使用SQL條件匹配查詢數(shù)據(jù)。
# SQL 方式查詢文檔,注意后面不能帶;
POST _sql?format=json
{
"query": """
SELECT * FROM "es_db" where name = '王五'
"""
}
輸出結(jié)果:
4,刪除文檔操作?
格式:DELETE /索引名稱/_doc/id
DELETE /es_db/_doc/F-G4NYgBnLz27AmKVPS4
5,ElasticSearch文檔批量寫入操作
批量對文檔進(jìn)行寫操作是通過_bulk的API來實現(xiàn)的
-
請求方式:POST
-
請求地址:_bulk
-
請求參數(shù):通過_bulk操作文檔,一般至少有兩行參數(shù)(或偶數(shù)行參數(shù))
-
第一行參數(shù)為指定操作的類型及操作的對象(index,type和id)
-
第二行參數(shù)才是操作的數(shù)據(jù)
-
參數(shù)格式類似于:
{"actionName":{"_index":"indexName","_type":"typeName","_id":"id"}}
{"field1":"value1","field2":"value2"}
- actionName:表示操作類型,主要有create,index,delete和update
批量創(chuàng)建文檔create
POST _bulk
{"create":{"_index":"user_db","_type":"_doc","_id":1}}
{"id":1,"city":"哈爾濱","temperture":"25攝氏度"}
{"create":{"_index":"user_db","_type":"_doc","_id":2}}
{"id":2,"city":"長春","temperture":"26攝氏度"}
{"create":{"_index":"user_db","_type":"_doc","_id":3}}
{"id":3,"city":"沈陽","temperture":"27攝氏度"}
{"create":{"_index":"user_db","_type":"_doc","_id":5}}
{"id":5,"city":"大連","temperture":"27攝氏度"}
普通創(chuàng)建或全量替換index
POST _bulk
{"index":{"_index":"user_db","_type":"_doc","_id":1}}
{"id":1,"city":"哈爾濱","temperture":"25攝氏度"}
{"index":{"_index":"user_db","_type":"_doc","_id":2}}
{"id":2,"city":"長春","temperture":"26攝氏度"}
{"index":{"_index":"user_db","_type":"_doc","_id":3}}
{"id":3,"city":"沈陽","temperture":"27攝氏度"}
{"index":{"_index":"user_db","_type":"_doc","_id":5}}
{"id":5,"city":"大連","temperture":"27攝氏度"}
-
如果原文檔不存在,則是創(chuàng)建
-
如果原文的存在,則是替換(全量修改原文檔)
批量刪除delete
POST _bulk
{"delete":{"_index":"user_db","_type":"_doc","_id":3}}
{"delete":{"_index":"user_db","_type":"_doc","_id":4}}
# 將索引為3和索引為4的文檔數(shù)據(jù)刪除
批量修改update
POST _bulk
{"update":{"_index":"user_db","_type":"_doc","_id":1}}
{"doc":{"temperture":"30攝氏度"}}
{"update":{"_index":"user_db","_type":"_doc","_id":2}}
{"doc":{"temperture":"31攝氏度"}}
{"update":{"_index":"user_db","_type":"_doc","_id":3}}
{"doc":{"temperture":"32攝氏度"}}
{"update":{"_index":"user_db","_type":"_doc","_id":5}}
{"doc":{"temperture":"33攝氏度"}}
組合應(yīng)用
POST _bulk
{"delete":{"_index":"user_db","_type":"_doc","_id":"EuGSNYgBnLz27AmKKPT_"}}
{"index":{"_index":"user_db","_type":"_doc","_id":4}}
{"id":6,"city":"昆明","temperture":"34攝氏度"}
{"update":{"_index":"user_db","_type":"_doc","_id":5}}
{"doc":{"temperture":"33攝氏度"}}
# 先刪除索引為EuGSNYgBnLz27AmKKPT_的文檔數(shù)據(jù),然后創(chuàng)建索引為4的文檔數(shù)據(jù),然后更新索引為5的文檔中的temperture字段
批量讀取
GET _mget
{"docs":[{"_index":"es_db","_id":1},{"_index":"user_db","_id":1}]}
# 可以通過id批量獲取es_db的數(shù)據(jù)
GET /es_db/_mget
{
"ids":["1","2","3","4"]
}
6,ES檢索原理分析
索引的原理
索引是加速數(shù)據(jù)查詢的重要手段,其核心原理是通過不斷的縮小想要獲取數(shù)據(jù)的范圍來篩選出最終想要的結(jié)果,同時把隨機(jī)的事件變成順序的事件。
磁盤IO與預(yù)讀
磁盤IO是程序設(shè)計中非常高昂的操作,也是影響程序性能的重要因素,因此應(yīng)當(dāng)盡量避免過多的磁盤IO,有效的利用內(nèi)存可以大大的提升程序的性能。在操作系統(tǒng)層面,發(fā)生一次IO時,不光把當(dāng)前磁盤地址的數(shù)據(jù),而是把相鄰的數(shù)據(jù)也都讀取到內(nèi)存緩沖區(qū)內(nèi),局部預(yù)讀性原理告訴我們,當(dāng)計算機(jī)訪問一個地址的數(shù)據(jù)時,與其相鄰的數(shù)據(jù)也會很快被訪問到。每一次IO讀取的數(shù)據(jù)我們稱之為一頁(page)。具體一頁有多大數(shù)據(jù)跟操作系統(tǒng)有關(guān),一般為4k或8k,也就是我們讀取一頁內(nèi)的數(shù)據(jù)時,實際上才發(fā)生了一次IO,這個理論對于索引的數(shù)據(jù)結(jié)構(gòu)設(shè)計非常有幫助。
倒排索引
當(dāng)數(shù)據(jù)寫入ES時,數(shù)據(jù)將會通過 分詞 被切分為不同的term,ES將term與其對應(yīng)的文檔列表建立一種映射關(guān)系,這種結(jié)構(gòu)就是 倒排索引。如下圖所示:
?為了進(jìn)一步提升索引的效率,ES在term的基礎(chǔ)上利用term的前綴或者后綴構(gòu)建了term index,用于對term本身進(jìn)行索引,ES實際的索引結(jié)構(gòu)如下圖所示:
這樣當(dāng)我們?nèi)ニ阉髂硞€關(guān)鍵詞時,ES首先根據(jù)它的前綴或者后綴迅速縮小關(guān)鍵詞在term dictionary 中的范圍,大大減少了磁盤IO的次數(shù)。
-
單詞詞典(Term Dictionary):記錄所有文檔的單詞,記錄單詞到倒排列表的關(guān)聯(lián)關(guān)系
-
倒排列表(Posting List):記錄了單詞對應(yīng)的文檔結(jié)合,由倒排索引項組成
-
倒排索引項(Posting):
-
文檔ID
-
詞頻TF:該單詞在文檔中出現(xiàn)的次數(shù),用于相關(guān)性評分
-
位置(Position):單詞在文檔中分詞的位置,用于短語搜索(match phrase query)
-
偏移(Offset):記錄單詞的開始結(jié)束位置,實現(xiàn)高亮顯示
-
四,Python讀取excel數(shù)據(jù)批量寫入ES文檔數(shù)據(jù)
excel數(shù)據(jù)展示:
python中提供了elasticsearch包用于操作ES。需要注意的是elasticsearch包的版本,不同版本的es使用不同版本的elasticsearch包。由于此處安裝es是安裝的elastsearch7版本,所以python安裝elastsearch7包。
pip install elasticsearch7
from elasticsearch7 import Elasticsearch
# 導(dǎo)入elasticsearch7包
import openpyxl
# 導(dǎo)入openpyxl包用于讀取excel文檔中的數(shù)據(jù)
client = Elasticsearch(hosts="http://192.168.26.10:9200", http_auth=("elastic", "elastic"))
# 配置es的連接方式,http_auth 是設(shè)置es的用戶名和密碼
wb = openpyxl.load_workbook(r'test.xlsx')
sheet = wb['Sheet1']
# 讀取test.xlsx文件中的Sheet1表
res = list(sheet.rows)
# 使用列表封裝行的生成器
title = [i.value for i in res[0]]
# 將表格中行的value值放到列表中,即拿取表格的表頭數(shù)據(jù)
for item in res[1:]: # 從第二行開始遍歷
data = [i.value for i in item]
dic = dict(zip(title,data))
# 將每一行的value值和表頭封裝到字典中
client.index(index='test_user_db',doc_type='_doc',document=dic)
# 將拿取到的字典數(shù)據(jù)寫入到es的test_user_db索引中
在kibana界面中查詢test_user_db索引中的文檔數(shù)據(jù),檢查寫入是否成功。
可以看到文檔寫入已成功。
也可以在python中利用Elasticsearch模塊查詢
query = {'match_all': {}}
# 查詢所有文檔數(shù)據(jù)
allDoc = client.search(index='test_user_db', query=query,size=30)
# 查詢test_user_db索引,指定顯示最大條數(shù)30條
for item in allDoc['hits']['hits']:
print(item['_source'])
結(jié)果輸出:文章來源:http://www.zghlxwxcb.cn/news/detail-772536.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-772536.html
到了這里,關(guān)于Elasticsearch基礎(chǔ)學(xué)習(xí)筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!