前言
Elasticsearch
的簡單入門請參考之前寫的一篇文章Elasticsearch簡單入門篇,這篇簡單介紹啦Elasticsearch
的基本安裝温眉、Docker
安裝方法咱台、基本的概念蒲每,以及如何使用Java
代碼實(shí)現(xiàn)對(duì)Elasticsearch
的CRUD
操作等入門知識(shí)。
內(nèi)容摘要
1.1.Elastic Stack應(yīng)用場景
- 網(wǎng)站搜索、代碼搜索等(例如生產(chǎn)環(huán)境的日志收集 ——格式化分析——全文檢索——系統(tǒng)預(yù)警)
- 日志管理與分析啊胶、應(yīng)用系統(tǒng)性能分析、安全指標(biāo)監(jiān)控等
1.2.Elastic Stack技術(shù)架構(gòu)
Elastic static家族產(chǎn)品
高級(jí)架構(gòu)
Elastic
的技術(shù)架構(gòu)可以簡單垛贤,也可以高級(jí)焰坪,它是很具有擴(kuò)展性的,最簡單的技術(shù)架構(gòu)就是使用Beats
進(jìn)行數(shù)據(jù)的收集聘惦,Beats
是一種抽象的稱呼某饰,具體的可以是使用FileBeat
收集數(shù)據(jù)源為文件的數(shù)據(jù)或者使用TopBeat
來收集系統(tǒng)中的監(jiān)控信息,可以說類似Linux
系統(tǒng)中的TOP
命令善绎,當(dāng)然還有很多的Beats
的具體實(shí)現(xiàn)黔漂,再使用logstash
進(jìn)行數(shù)據(jù)的轉(zhuǎn)換和導(dǎo)入到Elasticsearch
中,最后使用Kibana
進(jìn)行數(shù)據(jù)的操作以及數(shù)據(jù)的可視化等操作禀酱。
當(dāng)然炬守,在生產(chǎn)環(huán)境中,我們的數(shù)據(jù)可能在不同的地方剂跟,例如關(guān)系型數(shù)據(jù)庫Postgre
减途,或者MQ
,再或者Redis
中浩聋,我們可以統(tǒng)一使用Logstash
進(jìn)行數(shù)據(jù)的轉(zhuǎn)換观蜗,同時(shí)臊恋,也可以根據(jù)數(shù)據(jù)的熱度不同將ES
集群架構(gòu)為一種冷溫?zé)?/strong>架構(gòu)衣洁,利用ES
的多節(jié)點(diǎn),將一天以內(nèi)的數(shù)據(jù)稱謂熱數(shù)據(jù)抖仅,讀寫頻繁坊夫,就存放在ES
的熱節(jié)點(diǎn)中砖第,七天以內(nèi)的數(shù)據(jù)稱之為溫?cái)?shù)據(jù),就是偶爾使用的數(shù)據(jù)存放在溫節(jié)點(diǎn)中环凿,將極少數(shù)會(huì)用到的數(shù)據(jù)存放在冷節(jié)點(diǎn)中梧兼。
1.3.ES基本概念回顧
文檔(Document)
Elasticsearch
面向文檔性,文檔就是所有可搜索數(shù)據(jù)的最小單位智听。比如羽杰,一篇PDF
中的內(nèi)容,一部電影的內(nèi)容到推,一首歌等考赛,文檔會(huì)被序列化成JSON
格式,保存在Elasticsearch
中莉测,必不可少的是每個(gè)文檔都會(huì)有自己的唯一標(biāo)識(shí)颜骤,可以自己指定,也可以由Elasticsearch
幫你生成捣卤。類似數(shù)據(jù)庫的一行數(shù)據(jù)忍抽。
元數(shù)據(jù)(標(biāo)注文檔信息)
"_index" : "user",
"_type" : "_doc",
"_id" : "l0D6UmwBn8Enzbv1XLz0",
"_score" : 1.6943597,
"_source" : {
"user" : "mj",
"sex" : "男",
"age" : "18"
}
-
_index
:文檔所屬的索引名稱。 -
_type
:文檔所屬的類型名董朝。 -
_id
:文檔的唯一標(biāo)識(shí)鸠项。 -
_version
:文檔的版本信息。 -
_score
:文檔的相關(guān)性打分子姜。 -
_source
:文檔的原始JSON
內(nèi)容锈锤。
索引(index)
索引是文檔的容器,是一類文檔的集合闲询,類似關(guān)系數(shù)據(jù)庫中的表久免,索引體現(xiàn)的是一種邏輯空間的概念,每個(gè)索引都應(yīng)該有自己的Mapping
定義扭弧,用于定義包含文檔的字段名和字段類型阎姥。其中Shard
(分片)體現(xiàn)的是物理空間的一種概念,就是索引中的數(shù)據(jù)存放在Shard
上鸽捻,因?yàn)橛欣布汉舭停WC高空用,當(dāng)其中一個(gè)機(jī)器崩潰中御蒲,保存在它上的分片數(shù)據(jù)也能被正常訪問衣赶,因此,存在啦分片副本厚满。
索引中有兩個(gè)重要的概念府瞄,Mapping
和Setting
。Mapping
定義的是文檔字段和字段類型碘箍,Setting
定義的是數(shù)據(jù)的不同分布遵馆。
類型(Type)
- 在7.0之前鲸郊,一個(gè)
index
可以創(chuàng)建多個(gè)Type
。之后就只能一個(gè)index
對(duì)應(yīng)一個(gè)Type
货邓。
節(jié)點(diǎn)(Node)
一個(gè)節(jié)點(diǎn)就是一個(gè)Elaseticsearch
實(shí)例秆撮,本質(zhì)就是一個(gè)JAVA
進(jìn)程。每一個(gè)節(jié)點(diǎn)啟動(dòng)后换况,默認(rèn)就是一個(gè)master eligible
節(jié)點(diǎn)职辨。就是具備成為master
資格的節(jié)點(diǎn),你也可以狠心的指定它沒有這個(gè)資格(node.master:false
)戈二,
第一個(gè)節(jié)點(diǎn)啟動(dòng)后拨匆,他就選自己成為Master
節(jié)點(diǎn)類,每一個(gè)節(jié)點(diǎn)上都保存了集群狀態(tài)挽拂,但是惭每,只有Master
才能修改集群狀態(tài)信息。集群狀態(tài)信息就比如:
- 所有的節(jié)點(diǎn)信息亏栈。
- 所有的索引信息台腥,索引對(duì)應(yīng)的
mapping
信息和setting
信息。 - 分片的路由信息绒北。
分片(shard)
- 主分片:用于解決數(shù)據(jù)的水平擴(kuò)展問題黎侈,通過主分片就數(shù)據(jù)分布在集群內(nèi)的不同節(jié)點(diǎn)上,主分片在創(chuàng)建索引的時(shí)候就指定了闷游,后面就不允許修改峻汉,除非重新定義
Index
。 - 副本:用于解決高可用的問題脐往,分片是主分片的拷貝休吠。副本分片數(shù)可以動(dòng)態(tài)的調(diào)整,增加副本數(shù)量可以在一定的程度上提高服務(wù)的可用性业簿。關(guān)于主分片的理解可以如下圖瘤礁,看是怎樣實(shí)現(xiàn)高可用的,
"settings" : {
"index" : {
// 設(shè)置主分片數(shù)
"number_of_shards" : "1",
"auto_expand_replicas" : "0-1",
"provided_name" : "kibana_sample_data_logs",
"creation_date" : "1564753951554",
// 設(shè)置副本分片數(shù)
"number_of_replicas" : "1",
"uuid" : "VVMLRyw6TZeSfUvvLNYXEw",
"version" : {
"created" : "7010099"
}
}
}
1.4.倒排索引
正排索引:就是文檔ID
到文檔內(nèi)容的索引梅尤,簡單講柜思,就是根據(jù)ID
找文檔。
倒排索引:就是根據(jù)文檔內(nèi)容找文檔巷燥。
倒排索引包含如下信息:
- 單詞詞典:用于記錄所有文檔的單詞赡盘,以及單詞到倒排列表的關(guān)聯(lián)關(guān)系。
- 倒排列表:記錄的是單詞對(duì)應(yīng)的文檔集合缰揪,由倒排索引項(xiàng)組成陨享,其中包含
- 文檔ID
- 單詞出現(xiàn)的次數(shù),用于相關(guān)性的評(píng)分
- 單詞出現(xiàn)的位置
- 偏移量,用于記錄單詞的開始位置和結(jié)束位置霉咨,用于單詞的高亮顯示
舉例說明什么是正排索引和倒排索引,其中正排索引如下:
文檔ID | 文檔內(nèi)容 |
---|---|
1101 | Elasticsearch Study |
1102 | Elasticsearch Server |
1103 | master Elasticsearch |
講上例Elasticsearch
單詞修改為倒排索引拍屑,如下:
文檔ID(Doc ID) | 出現(xiàn)次數(shù)(TF) | 位置(Position) | 偏移量(Offset) |
---|---|---|---|
1101 | 1 | 0 | <0,13> |
1102 | 1 | 0 | <0,13> |
1103 | 1 | 1 | <7,20> |
Elasticsearch
中的每一個(gè)字段都有自己的倒排索引途戒,也可以指定某些字段不做索引,可以節(jié)省存儲(chǔ)空間僵驰,缺點(diǎn)就是不能被搜索到喷斋。
1.5.Analyzer分詞
Analysis
:文本分析,就是將文本轉(zhuǎn)換為單詞(term
或者token
)的過程蒜茴,其中Analyzer
就是通過Analysis
實(shí)現(xiàn)的星爪,Elasticsearch
給我們內(nèi)置例很多分詞器。
-
Standard Analyzer
:默認(rèn)的分詞器粉私,按照詞切分顽腾,并作大寫轉(zhuǎn)小寫處理 -
Simple Analyzer
:按照非字母切分(符號(hào)被過濾),并作大寫轉(zhuǎn)小寫處理 -
Stop Anayzer
:停用詞(the
诺核、is
)切分抄肖,并作大寫轉(zhuǎn)小寫處理 -
Whitespace Anayzer
:空格切分,不做大寫轉(zhuǎn)小寫處理 -
IK
:中文分詞器窖杀,需要插件安裝 -
ICU
:國際化的分詞器漓摩,需要插件安裝 -
jieba
:時(shí)下流行的一個(gè)中文分詞器。安裝方法見附錄
PS:
Elasticsearch
安裝插件入客,[root@34d02ff9d16c elasticsearch]# bin/elasticsearch-plugin install analysis-icu
查看已經(jīng)安裝的插件:
bin/elasticsearch-plugin list
1.6.Search API
在ES
中管毙,我們可以使用URL Search
和Request Body Search
進(jìn)行相關(guān)的查詢操作。
URL 查詢
使用基本的查詢
GET /user/_search?q=2012&df=title&sort=year:desc&from=0&size=10
{
??profile??: true
}
- 使用
q
指定查詢的字符串 - 使用
df
指定查詢的字段 - 使用
sort
進(jìn)行排序桌硫,使用from
和size
指定分頁 - 使用
profile
可以查詢查詢是如何進(jìn)行查詢的
指定所有字段的泛查詢
GET /user/_search?q=2012
{
"profile":"true"
}
指定字段的查詢
GET /user/_search?q=title:2012&sort=year:desc&from=0&size=10&timeout=1s
{
"profile":"true"
}
Term查詢
GET /user/_search?q=title:Beautiful Mind
{
"profile":"true"
}
- 上例中的
Beautiful
和Mind
就是兩個(gè)Term
夭咬,Term
是查詢中最小的單位。 -
Term
查詢是OR
的關(guān)系铆隘,在上例中就是title
字段包含Beautiful
或者包含Mind
都會(huì)被檢索到皱埠。
Phrase查詢
GET /user/_search?q=title:"Beautiful Mind"
{
"profile":"true"
}
- 使用引號(hào)表示
Phrase
查詢 -
Phrase
查詢表示的不僅是And
的關(guān)系,即Title
字段中不僅要包含Beautiful Mind
咖驮,而且边器。順序還要一致。
分組查詢
GET /user/_search?q=title:(Beautiful Mind)
{
"profile":"true"
}
- 使用中括號(hào)表示分組查詢托修,一般使用
Term
查詢的時(shí)候都會(huì)帶上分組查詢忘巧。
布爾查詢
- 使用
AND
、OR
睦刃、NOT
或者||
砚嘴、&&
、!
- 還可以使用
+
(表示must
),使用-
(表示must_not
) - 需要注意的是必須大寫
GET /user/_search?q=title:(Beautiful NOT Mind)
{
"profile":"true"
}
GET /user/_search?q=title:(Beautiful %2BMind)
{
"profile":"true"
}
PS:
%2B
表示的就是+
,上例子表示的就是title
字段中既要包含Beautiful
际长,也要包含Mind
字段
范圍查詢
GET /user/_search?q=title:beautiful AND age:[2002 TO 2018%7D
{
"profile":"true"
}
- 使用
[ ]
表示閉區(qū)間耸采,使用{ }
表示開區(qū)間,例如age :[* TO 56]
- 使用算術(shù)符表示范圍工育,例如
year :>=2019 && <=1970
PS:
URL Search
還有很多查詢方式虾宇。例如通配符查詢,正則插敘如绸,模糊匹配嘱朽,相似查詢,其中通配符查詢不建議使用怔接。
Request Body 查詢
將查詢的條件參數(shù)放在Request Body
中搪泳,調(diào)用查詢接口,就是Request Body
查詢扼脐,
基本 的查詢
POST /movies,404_idx/_search?ignore_unavailable=true
{
"profile": true,
"query": {
"match_all": {}
}
}
- 使用
gnore_unavailable=true
可以避免索引404_idx
不存在導(dǎo)致的報(bào)錯(cuò) -
profile
和URL Search
查詢一樣岸军,可以看到查詢的執(zhí)行方式
分頁查詢
POST /movies/_search
{
"from":10,
"size":20,
"query":{
"match_all": {}
}
}
排序查詢
POST /movies/_search
{
"sort":[{"order_date":"desc"}],
"query":{
"match_all": {}
}
}
過濾要查詢的字段
POST /movies/_search
{
"_source":["order_date"],
"query":{
"match_all": {}
}
}
- 如果一個(gè)文檔中的字段太多,我們不需全部字段顯示瓦侮,就可以使用
_source
指定字段凛膏。可以使用通配符脏榆。
使用腳本查詢
- 將
ES
中的文檔字段進(jìn)行一定的處理后猖毫,再根據(jù)這個(gè)新的字段進(jìn)行排序,
GET /movies/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless",
"source": "doc['name'].value+'是大佬'"
}
}
},
"query": {
"match_all": {}
}
}
Term查詢
POST /movies/_search
{
"query": {
"match": {
"title": "last christmas"
}
}
}
POST movies/_search
{
"query": {
"match": {
"title": {
"query": "last christmas",
"operator": "and"
}
}
}
}
- 使用
match
须喂,表示的就是OR
的關(guān)系 - 使用
operator
吁断,表示查詢方式
Math_phrase查詢
POST movies/_search
{
"query": {
"match_phrase": {
"title":{
"query": "one love",
"slop": 4
}
}
}
}
-
slop
指定查詢的字符中允許出現(xiàn)的字符
1.7.Dynamic Mapping
Mapping
可以簡單的理解為數(shù)據(jù)庫中的Schema
定義,用于定義索引中的字段的名稱坞生,定義字段的類型仔役,字段的倒排索引,指定字段使用何種分詞器等是己。Dynamic Mapping
意思就是在我們創(chuàng)建文檔的時(shí)候又兵,如果索引不存在,就會(huì)自動(dòng)的創(chuàng)建索引卒废,同時(shí)自動(dòng)的創(chuàng)建Mapping
沛厨,ElasticSearch
會(huì)自動(dòng)的幫我們推算出字段的類型,當(dāng)然摔认,也會(huì)存在推算不準(zhǔn)確的時(shí)候逆皮,就需要我們手動(dòng)的設(shè)置。常用的字段類型如下:
- 簡單類型:
Text
参袱、Date
电谣、Integer
秽梅、Boolean
等 - 復(fù)雜類型:對(duì)象類型和嵌套類型。
我們可以使用GET /shgx/_mapping
查詢索引的Mapping
的設(shè)置剿牺,需要注意的是以下幾點(diǎn):
- 當(dāng)我們對(duì)索引中的文檔新增字段時(shí)候企垦,希望可以更新索引的
Mapping
就可以可以設(shè)置Dynamic:true
。 - 對(duì)于已經(jīng)有數(shù)據(jù)的字段晒来,就不再允許修改其
Mapping
钞诡,因?yàn)?code>Lucene生成的倒排索引后就不允許修改。
Dynamic Mapping
可以設(shè)置三個(gè)值潜索,分別是:
-
true
:文檔可被索引臭增,新增字段也可被索引懂酱,Mapping
也會(huì)被更新竹习。 -
false
:文檔可被索引,新增字段不能被索引列牺,Mapping
不會(huì)被更新整陌。 -
strict
:新增字段寫入,直接報(bào)錯(cuò)瞎领。
如何寫Mapping
第一種方式是參考官方API
泌辫,純手工寫,也可以先創(chuàng)建一個(gè)臨時(shí)的Index
讓ElasticSearch
自動(dòng)當(dāng)我們推斷出基本的Mapping
九默,然后自己在改吧改吧震放,最后把臨時(shí)索引刪掉就是啦。下面列舉一些常用的Mapping
設(shè)置屬性:
-
index
:可以設(shè)置改字段是否需要被索引到驼修。設(shè)置為false
就不會(huì)生成倒排索引殿遂,節(jié)省啦磁盤開銷 -
null_value
:可以控制NULL
是否可以被索引 -
cope_to
:將字段值放在一個(gè)新的字段中,可以使用新的字段search
乙各,但這個(gè)字段不會(huì)出現(xiàn)在_source
中墨礁。 -
anaylzer
:指定字段的分詞器 -
search_anaylzer
:指定索引使用的分詞器 -
index_options
:控制倒排索引的生成結(jié)構(gòu),有四種情況-
docs
:倒排索引只記錄文檔ID
-
freqs
:記錄文檔ID
和Term
-
positions
:記錄文檔ID
耳峦、Term
和Term Position
-
offsets
:記錄文檔ID
恩静、Term
、Term Position
和offsets
-
PS:
Text
類型的字段默認(rèn)的是Position
蹲坷,其它類型默認(rèn)的是docs
驶乾,記錄的越多,占用的存儲(chǔ)空間就越大循签。
1.8.Aggregation聚合分析
ElasticSearch
不僅僅是搜索強(qiáng)大轻掩,他的統(tǒng)計(jì)功能也是相當(dāng)?shù)膹?qiáng)大的,聚合分析就是統(tǒng)計(jì)整個(gè)數(shù)據(jù)的一個(gè)分類數(shù)量等懦底,例如武侯區(qū)有多少新樓盤唇牧。天府新區(qū)有多少新樓盤罕扎,通過聚合分析我們只需要寫一條語句就可以得到。在加上Kibana
的可視化分析丐重,簡直就是清晰腔召,高效。常用的集合有以下幾種:
-
Bucket Aggregation
:滿足特定條件的一些集合扮惦,使用關(guān)鍵字terms
-
Metric Aggregation
:簡單的數(shù)學(xué)運(yùn)算臀蛛,對(duì)字段進(jìn)行統(tǒng)計(jì)分析,使用關(guān)鍵字min
崖蜜、max
浊仆、sum
、avg
等豫领,使用關(guān)鍵字aggs
-
Pipeline Aggregation
:二次聚合 -
Matrix Aggregation
:對(duì)多個(gè)字段進(jìn)行操作抡柿,提供一個(gè)結(jié)果矩陣
Bucket分析示例
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs":{
"flight_dest":{
"terms":{
"field":"DestCountry"
}
}
}
}
Metric分析示例
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs":{
"flight_dest":{
"terms":{
"field":"DestCountry"
},
"aggs":{
"avg_price":{
"avg":{
"field":"AvgTicketPrice"
}
},
"max_price":{
"max":{
"field":"AvgTicketPrice"
}
},
"min_price":{
"min":{
"field":"AvgTicketPrice"
}
}
}
}
}
}
附錄一
相關(guān)閱讀
- 安裝
docker
:https://www.docker.com/products/docker-desktop - 安裝
docker-compose
:https://docs.docker.com/compose/install -
Elasticsearch + Logstash + Kibana
的docker-compose
配置 :https://github.com/deviantony/docker-elk -
docker
安裝Elasticsearch
插件 :https://www.elastic.co/cn/blog/elasticsearch-docker-plugin-management -
Elasticsearch
的中文社區(qū)https://elasticsearch.cn/ -
Beats
的產(chǎn)品:https://www.elastic.co/cn/downloads/beats - 不錯(cuò)的中文分詞器:https://github.com/fxsjy/jieba
- 不錯(cuò)的英文分詞器:https://github.com/nltk/nltk
-
IK
分詞器:https://github.com/medcl/elasticsearch-analysis-ik -
THULAC
分詞器,清華大學(xué)自然語言處理系的分詞器https://github.com/thunlp/THULAC-Python -
ES
發(fā)展史:https://www.cnblogs.com/wangzhen3798/p/10751516.html - ELK6.0部署::Elasticsearch+Logstash+Kibana搭建分布式日志平臺(tái)
- ElasticSearch集群可視化工具cerebro
- 測試數(shù)據(jù)集下載
更多文章等恐,更好的閱讀體驗(yàn)洲劣,請前往個(gè)人網(wǎng)站查看 碼醬博客