一飒责、基本屬性介紹
1.包含搜索和聚合兩大功能
2.天生分布式結(jié)構(gòu),支持水平擴(kuò)展,可以是多個節(jié)點(diǎn)甚至是幾百個節(jié)點(diǎn)
3.Restful風(fēng)格的接口接入席里,可以多語言使用
元數(shù)據(jù)
4.事務(wù)性沒有關(guān)系型數(shù)據(jù)庫強(qiáng)大
document 文檔(相當(dāng)于表中每一行數(shù)據(jù))
所有可搜索數(shù)據(jù)的最小單元,相當(dāng)于關(guān)系型數(shù)據(jù)庫的一條記錄拢驾;
會被序列化成Jason格式奖磁;
每個文檔都有自己的唯一id,這個id可以指定繁疤,也可以由es自動生成署穗,文檔的格式比較靈活不需要預(yù)先定義格式
其中的_version(和type同級)版本號寥裂,可以通過版本號控制來處理并發(fā)讀寫,同一個id即使被刪除version也會增加
index 索引(相當(dāng)于表)
? 索引是文檔的容器案疲,是一類文檔的結(jié)合
索引中有Mapping(相當(dāng)于定義表結(jié)構(gòu)封恰,指明字段名字段類型),Setting(設(shè)置索引的數(shù)據(jù)分布褐啡,物诺舔,7.0理層面的配置),Type7.0之前一個索引可以有多個type备畦,7.0之后一個索引只有一個type
? 注:索引也可以做為一個動詞來理解低飒,表示一個文檔寫入es的過程。
二懂盐、節(jié)點(diǎn)褥赊、集群、分片莉恼、副本
節(jié)點(diǎn)
在不同的角度拌喉,節(jié)點(diǎn)可以劃分為不同的類型:
Master節(jié)點(diǎn)多節(jié)點(diǎn)部署,會有選舉機(jī)制選舉master節(jié)點(diǎn)俐银,只有master節(jié)點(diǎn)能修改集群狀態(tài)尿背。
? 集群狀態(tài):所有節(jié)點(diǎn)的信息
? ? ? ? ? ? ? ? ? ? 所有的索引和相關(guān)的Mapping與Setting信息
? ? ? ? ? ? ? ? ? ? 分片的路由信息
Data Node數(shù)據(jù)節(jié)點(diǎn):存儲數(shù)據(jù),當(dāng)一個節(jié)點(diǎn)不夠時可以水平擴(kuò)展一個數(shù)據(jù)節(jié)點(diǎn)
Coordnating Node負(fù)責(zé)接收客戶端的請求捶惜,將請求分發(fā)到合適的節(jié)點(diǎn)田藐,最終將結(jié)果匯總到一起,es中每個節(jié)點(diǎn)默認(rèn)都有這個職責(zé)
冷熱節(jié)點(diǎn)冷節(jié)點(diǎn)可以用來存儲比較舊的數(shù)據(jù)吱七,配置也可以比較低汽久,,熱節(jié)點(diǎn)可以用來存儲比較活躍的數(shù)據(jù)配置較高
分片
主分片踊餐,用以解決數(shù)據(jù)水平擴(kuò)展的問題回窘。通過分片可以將數(shù)據(jù)水平分散到集群內(nèi)的所有節(jié)點(diǎn)上
一個分片是一個運(yùn)行的Lucence實(shí)例
主分片數(shù)在索引創(chuàng)建時指定,后續(xù)不允許修改市袖,除非Reindex
副本分片啡直,用以解決數(shù)據(jù)高可用的問題。副本分片是主分片的拷貝苍碟,分片書可以動態(tài)調(diào)整
沒有副節(jié)點(diǎn)只有副分片
獲取集群健康狀況
GET _cluster/health? ? Green:主副分片都正常? Yellow 主分片正常酒觅,有副分片未能正常分配
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Red:有主分片未能分配
三、基本操作
文檔的基本操作包括
Index (根據(jù)id 有的話就是刪除再添加微峰,沒有的話就直接創(chuàng)建)
Create(直接創(chuàng)建舷丹,id沖突會報錯)
Update(根據(jù)id修改)
Delete(根據(jù)id刪除)
添加一條文檔 PUT? user/_doc/1? 這個id有值會先刪除再添加,沒值直接添加
PUT只能用來做index索引或者_(dá)create創(chuàng)建索引操作
PUT users/_create/1 表示創(chuàng)建一個id為1的文檔蜓肆,如果id已經(jīng)存在會報錯
個人感覺_doc相當(dāng)于一個占位符颜凯,沒有意義時就用它
POST根據(jù)id做修改 也可以通過這個命令在原來的文檔上增加字段
POST users/_doc? ? 表示創(chuàng)建一個文檔谋币,自動生成id
批量操作:
批量執(zhí)行語句 關(guān)鍵字 _bulk
批量獲取? _mget
批量查詢 關(guān)鍵字 _msearch
四、倒排索引和正排索引
正排索引:文檔id -->文檔內(nèi)容-->關(guān)鍵字
倒排索引:關(guān)鍵字-->文檔內(nèi)容-->文檔id
倒排索引包含的部分:
單詞詞典症概,記錄了文檔所有的單詞和單詞與倒排列表的關(guān)聯(lián)關(guān)系
倒排列表:組要是倒排索引項(xiàng)(文檔id蕾额、詞頻、位置彼城、偏移量)
ES中json文檔中的每個字段都有自己的倒排索引诅蝶,也可以在配置文件中指定某些字段不做索引
分詞器:es內(nèi)置了很多分詞器,可以根據(jù)需要指定募壕,也可以設(shè)置近義詞调炬,停用詞
五、es的查詢
匹配的形式:
1.可以在一個index中匹配也可以在多個index中匹配
2.可以在一個字段中匹配也可以在多個所有字段中匹配舱馅,默認(rèn)在所有字段中索引
3.入?yún)⒖梢允且粋€關(guān)鍵字他匪,也可以是多個關(guān)鍵字铝宵,關(guān)鍵字之間支持集合式的關(guān)系(or艺普,and倒信,must,
not must),也支持根據(jù)范圍查詢(時間范圍,數(shù)據(jù)范圍)
4.查詢結(jié)果也可以像MySQL一樣指定字段资溃,也可以按字段排序
URI Search
是用url加get的方式查詢
Request Body Search
基于json格式的查詢
搜索結(jié)果可以根據(jù)需要過濾武翎,過濾掉不需要的數(shù)據(jù)
也可以根據(jù)搜索相關(guān)性打分進(jìn)行排序烈炭,這個排序也可以根據(jù)業(yè)務(wù)需求來排序
1.URI Search
在URL中設(shè)置屬性:
q:指定查詢的語句 就是關(guān)鍵字
df:默認(rèn)字段溶锭,不指定時,會對所有字段進(jìn)行查詢
Sort:排序
from和size:用于分頁
profile:查看查詢是如何被執(zhí)行的
GET /movies/_search?q=title:"Beautiful Mind"? 雙引號表示查詢title中既包含Beautiful又包含Mind的數(shù)據(jù)
GET /movies/_search?q=title(Beautiful Mind) 括號表示查詢title中包含Beautiful或者包含Mind的數(shù)據(jù)(分組)
左邊的是關(guān)系符隙,右邊的是范圍
也支持通配符查詢b.*趴捅,模糊查詢(兼容錯誤輸入 beautifl 可匹配上 beautiful),相識度查詢?
2.Request Body Search
個人覺得Request Body比較好用
(1)簡單查詢
可以指定查詢的列霹疫,也可以分頁查詢拱绑,不只這種方式其他查詢方式也可以這樣查
GET _index/_search
{
"_source":["列名1","列名2","列名3"],
"from":0 起始頁
"size":10 每頁顯示條數(shù)
"query":{
"match_all":{} 查詢所有的文檔
}
}
(2)腳本查詢
也支持根據(jù)腳本計算,將將計算后的結(jié)果拼裝成一個新列丽蝎,painless是一種腳本
將order_date一列的值后邊加一個“hello”猎拨,在結(jié)果集中作為一個新的列new_field,下面這個代碼中除了new_field和“_hello”屠阻,其他的基本上都是關(guān)鍵字
一般情況下需要這種腳本計算的業(yè)務(wù)红省,像訂單的對于金額的匯率轉(zhuǎn)換之類的
(3)復(fù)合查詢
支持根據(jù)關(guān)鍵字組合查詢,or国觉,and吧恃,,支持多個關(guān)鍵字嚴(yán)格按照順序匹配或多個關(guān)鍵字按照一定順序匹配
技術(shù)關(guān)鍵字Match
GET /_index/_doc/_search
{
"query":{
"match":{
"comment":"Last Christmas"相當(dāng)于是or麻诀,包含一個或兩個的文檔都會被匹配
}
}
}
GET /_index/_doc/_search
{
"query":{
"match":{
"comment":"Last Christmas"
“operator”:"AND"指定是and
}
}
}
技術(shù)關(guān)鍵字Match_Phrase
GET /_index/_doc/_search
{
"query":{
"match_phrase":{
"query":"Last Christmas"
“slop”:1沒有這個屬性表示必須挨著痕寓,有這一個屬性表示按固定間隔
}
}
}
(4)基于詞項(xiàng)的精確查詢? term
必要條件:列是一個整體傲醉,查詢的詞是一個整體
如果一個列包含的字很多,像描述類的列呻率,而且這個列做了分詞硬毕,這個時候拿描述中的一句話去搜索是搜索不到內(nèi)容的,因?yàn)榈古潘饕惺前丛~來做的筷凤,用一句話去精確匹配是匹配不到的昭殉,可以按照下邊這樣的方式來:
1.利用mapping設(shè)置多字段類型,將要搜索的列設(shè)置一個keyword類型的列藐守,然后在搜索時利用
term.keyword表示是精確匹配 這樣就解決問題了挪丢,同時也可以利用filter屬性表示不用打分,提高效率卢厂。
聯(lián)合表達(dá)一下解決的兩個必要條件
六乾蓬、index中的mapping
1.Mapping的作用:
定義索引中字段的名稱
定義索引中字段的類型:Text/Keyword? Date? Integer/Floating? Boolean
復(fù)雜類型(對象嵌套對象)? 針對地理數(shù)據(jù)的類型
字段倒排索引設(shè)置:字段需不需要索引,字段需不需要分詞慎恒,
字段索引的級別:關(guān)鍵字 doc_id, 關(guān)鍵字 doc_id 詞頻 任内, 關(guān)鍵字 doc_id 詞頻 所在行
關(guān)鍵字 doc_id 詞頻 所在行 所在列
正常一個type有一個mapping,但是7.0之后就沒有這個限制了
2.文檔的屬性Dynamic 等于true 表示走es默認(rèn)的mapping融柬,自動根據(jù)字段的值設(shè)置字段的類型死嗦;
3.如何對屬性為null的值進(jìn)行搜索
mapping中有null_value屬性,當(dāng)某列存在null值時粒氧,在mapping配置中將這個列的value_null:“NULLL”
4.copy_to? Mapping中設(shè)置中可以將多個列的值拷貝到一個新列中越除,搜索時可以按照這個新列搜索,但是真正匹配的還是按照原始的列進(jìn)行的匹配
5.當(dāng)某個列的值是一個數(shù)組時外盯,這個列的類型不是數(shù)組而是數(shù)組的泛型 如果是一個text類型的數(shù)組摘盆,這個列的類型是text
6.多字段類型,可以為一個字段設(shè)置子字段饱苟,像支持拼音搜索孩擂,為一個字段增加一個拼音子字段,子字段按照拼音分詞
7.精確值和全文本的區(qū)別:精確值(數(shù)值箱熬,字符串类垦,日期)不用做分詞,全文本一般做分詞
七城须、索引模板
Index Templates (全局的模板)
相當(dāng)于設(shè)置全局的索引屬性蚤认,當(dāng)新建的索引中某些屬性沒有設(shè)置時就會走模板中的屬性,如果有多個Index Templates會先采用order值高的template
Dynamic Index Templates (在具體index上的模板)
在具體的index上設(shè)置索引模板酿傍,像將所有text類型的列設(shè)置成不可分詞等
Dynamic 索引模板和Mapping中的Dynamic是有區(qū)別的
八烙懦、聚合
四種聚合方式:Bucket/Metric/Pipeline/Matrix
Metric 統(tǒng)計數(shù)量的查詢
min/max/sum/avg 一次輸出一個也可以一次輸出多個
Bucket分組的 查詢
也可以將分組和統(tǒng)計聯(lián)合起來查詢
================================基礎(chǔ)知識測試==================================
1.添加一個沒有索引的文檔,es會走怎樣的流程?
默認(rèn)情況下會創(chuàng)建一個索引(也可以通過設(shè)置不允許自動創(chuàng)建索引這樣會報錯)氯析,同時自己設(shè)置Mapping亏较,當(dāng)然還要看有沒有合適的Index Template
2.es7中唯一合法的type是什么?
_doc
3.分詞包括哪幾部分掩缓?
停用詞雪情、近義詞、分詞器
4.Request Body Search中Match和Match Phrase的區(qū)別你辣?
Match默認(rèn)是or的查詢 也可以通過operator設(shè)置成and
Match Phrase 是對多個關(guān)鍵字進(jìn)行整體查詢巡通,也可以通過slop設(shè)置關(guān)鍵字之間的間隔
5.Mapping的dynamic設(shè)置成strict或者false有什么區(qū)別?
strict? 文檔不可添加舍哄,列不可索引宴凉,mapping不會修改
false 文檔可以添加,列不可索引表悬,mapping不會修改
6.可以把一個字段的類型從"integer"改成“l(fā)ong”弥锄,因?yàn)檫@兩個類型是兼容的
錯,修改字段類型相當(dāng)于修改了mapping蟆沫,是需要ReIndex的
================================基礎(chǔ)知識測試==================================
一籽暇、相關(guān)性算分:
_score 將整體的一個查詢語句“****************”進(jìn)行分詞,將分的每個詞去和所有文檔饭庞、某個文檔去做比較(詞頻戒悠,次數(shù))等,然后將結(jié)果加權(quán)相加舟山,得到的就是某個文檔的打分
Boosting來影響打分:Boosting可以在索引绸狐、字段、查詢子條件三個層面設(shè)置 (在查詢語句中設(shè)置)
boost > 1 提升相關(guān)度? 0 < boost < 1 降低相關(guān)度? boost < 0 貢獻(xiàn)負(fù)分
也可以通過函數(shù):Function Score Query函數(shù)來設(shè)置搜索結(jié)果的排序規(guī)則:隨機(jī)排序捏顺、用某一列來影響打分結(jié)果(點(diǎn)贊數(shù)高的排在前)
二六孵、query多條件查詢
must must_not? should filter
注意上邊的keyword表示是對查詢的關(guān)鍵字不分詞纬黎,是看文檔是否包含這個關(guān)鍵字整體
如果想和列精確匹配需要將這個列設(shè)置一個keyword子列
修改bool查詢的結(jié)構(gòu)影響布爾查詢的算分
左邊:四個條件對算分的影響是一樣的幅骄, 右邊:最后兩個條件合起來和前邊一個條件的算法相同
總結(jié)一下學(xué)過的查詢語句
query
bool、constant_score
filter本今、should拆座、must、must_not
term冠息、match挪凑、match_phrase
三、查詢模板和Index Alias
1.定義查詢模板
POST _scripts/tmb
{
"script":{
? "lang":"mustache"
? "source":{
"_source":[? ? ? 指定查詢的列
? “title","overview"
],
"size":20,? 設(shè)置查詢條數(shù)
"query":{
? "multi_match":{
? ? "query":”{ {q} }“? 設(shè)置請求參數(shù)
? ? ”fields":["title","overview"]
}
}
? }
}
}
關(guān)于模板的語法很豐富逛艰,可以設(shè)置比較靈活
2.調(diào)用模板
POST? tmdb/_search/template
{
"id":"tmdb",? ? 指定模板id
"params":{
"q":"basketball with cartoon aliens"? ? 輸入請求參數(shù)
}
}
3.Index Alias相當(dāng)于是索引副本
可以取一個別名存儲一個索引中的全部或者部分(根據(jù)指定條件過濾)數(shù)據(jù)
例如:將某個索引的數(shù)據(jù)按天存一個副本躏碳,這樣能減少查詢范圍
四、搜索的擴(kuò)展功能(根據(jù)錯誤關(guān)鍵字推測結(jié)果散怖,自動補(bǔ)全上下文菇绵,跨集群搜索)
1.根據(jù)錯誤的關(guān)鍵字返回推薦的結(jié)果
term suggester\phrase suggester? 兩種api
將輸入的關(guān)鍵字肄渗,經(jīng)過最小的變動找到相近的關(guān)鍵字進(jìn)行搜索
2.自動補(bǔ)全上下文
completion suggester
因?yàn)樽詣友a(bǔ)全對性能要求比較嚴(yán)格所以未倒排索引,而是將數(shù)據(jù)編碼成FST格式和索引一起存放咬最,加載進(jìn)內(nèi)存翎嫡,速度很快
FST只能用于前綴查找
使用:在mapping中設(shè)置列的type是completion就行