本文是基于es6.6的版本, 前面有一篇文章是關(guān)于安裝的: http://www.reibang.com/p/1d2ddb92f6fb,文中出現(xiàn)的翻譯可能不太準(zhǔn)確,更多請參考官方文檔https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
索引模板
定義
官網(wǎng)定義
大概翻譯
索引模板允許您定義在創(chuàng)建新索引時(shí)自動應(yīng)用的模板.模板包括settings和mappings以及一個簡單的模式模板(用于控制是否應(yīng)將模板應(yīng)用于新索引)
注意: 模板僅僅在索引創(chuàng)建的時(shí)候應(yīng)用.修改模板時(shí)不會影響已經(jīng)存在的索引.使用"create index API"創(chuàng)建索引時(shí),模板中定義的settings和mappings會被索引繼承,但是索引中自定義的相同部分會覆蓋模板的設(shè)置(這是我自己的理解)
我的理解
模板就好比我們寫代碼的時(shí)候的父類,在父類中定義了一些公共的方法,子類(索引)可以直接使用這些方法,也可以自己重寫這些方法實(shí)現(xiàn)自己特定的功能.一般適用于創(chuàng)建多個類似索引的時(shí)候,避免很多重復(fù)工作,方便索引為維護(hù).
其實(shí)ES默認(rèn)就會自帶很多模板,我們可以在es-head直接查看到
創(chuàng)建
下面創(chuàng)建一個名字為article_template的模板,該模板匹配article*類的全部索引(比如article_1,article_2),匹配到此模板的索引,在"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd", "yyyy/MM/dd"默認(rèn)將這幾種格式的數(shù)據(jù)映射成date類型,默認(rèn)映射的字段created_at和updated_at為date類型,用動態(tài)模板把所有字符串映射成text和keyword類型并使用ik_smart分詞
{
? ? "index_patterns": ["article*"],? //匹配索引的,數(shù)組的形式,證明可以多個
? ? ? "settings": { //基本設(shè)置
? ? ? ? ? ? "number_of_shards": 1, //主分片數(shù)
? ? ? ? ? ? "number_of_replicas": 0 //備份數(shù)
? ? ? },
? ? ? "mappings": { //映射
? ? ? ? ? "_doc": { //這個其實(shí)就是es的type,在es6.*的版本中,一個index只能存儲一種type(7的版本會刪除type),所以寫成_doc(文檔),你可以自己隨便定義,反正最終展現(xiàn)形式就是type
? ? ? ? "_source": {? "enabled": true }, //是否存儲所有源數(shù)據(jù),建議設(shè)置成true,如果只需要設(shè)置部分?jǐn)?shù)據(jù),可以在具體字段中使用store
? ? ? ? ? ? "dynamic_date_formats": ["yyyy-MM-dd HH:mm:ss","yyyy-MM-dd", "yyyy/MM/dd"], //只有滿足設(shè)定條件的字段會映射成date類型,不過多個類型只會存在一種,也就是第一次插入的是yyyy-MM-dd這種格式,后面也就必須全是這種格式,所以建議這個設(shè)置一個就好
? ? ? ? ? ? "properties": { //具體設(shè)置字段
? ? ? ? ? ? ? ? "created_at": { ? ? ? ? ? "type": "date" ? ? ? ? },? //將created_at字段設(shè)置成date類型
? ? ? ? ? ? ? ? ? ? "updated_at": { ? ? ? ? ? "type": "date" ? ? ? ? } //將updated_at字段設(shè)置成date類型
? ? ? ? ? ? },
? ? ? ? ? ? "dynamic_templates": [ //動態(tài)模板設(shè)置,前面properties中默認(rèn)只設(shè)置了兩個字段,如果新添加沒有設(shè)置的字段,es默認(rèn)會自己完成映射,但是你需要自己來設(shè)置這些映射規(guī)則沒救要使用動態(tài)模板.下面一整段的意思就是把字符串映射成自定義的規(guī)則
? ? ? ? ? ? {? ? "strings":
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? "match_mapping_type": "string", //匹配本來es要映射成字符串的字段
? ? ? ? ? ? ? ? ? ? ? ? "mapping":{
? ? ? ? ? ? ? ? ? ? ? ? ? ? "type": "text", //匹配的字段映射成text類型
? ? ? ? ? ? ? ? ? ? ? ? ? ? "analyzer": "ik_smart", //使用ik_smart分詞
? ? ? ? ? ? ? ? ? ? ? ? ? ? "fields": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "keyword": {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "type": "keyword", //同時(shí)映射keyword類型
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "ignore_above": 256 //忽略超過256字節(jié)的字段
? ? }? ? }? ? }? ? }? ? }? ? ]? ? }? }}
//批注: 在5之后的版本,string的類型不存在了,用text取而代之,字符串將默認(rèn)被同時(shí)映射成text和keyword類型,意味著可以在字符串字段(title)上進(jìn)行全文搜索, 也可以通過字符串字段.keyword(title.keyword)字段實(shí)現(xiàn)關(guān)鍵詞搜索及數(shù)據(jù)聚合.
模板使用的時(shí)候,你還可以設(shè)置order(索引匹配多個模板,數(shù)字大的優(yōu)先級越高),version和aliases等屬性,還有刪除模板,查詢模板等api,這些比較簡單,具體查看官網(wǎng)地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.6/indices-templates.html
索引
索引名字限制
1. 英文字母必須只是小寫
2. 不能包含這些特殊字符: \, /, *, ?, ", <, >, |, ` ` (空格), ,, #
3. 7.0之前的索引可以包含冒號(:)享潜,但已被棄用逻住,7.0+不支持
4. 不能以 - ,_,+開頭
5. 不能是 . 或者 ..
6. 不最長能超過255個字節(jié)(注意這里說的是字節(jié))
創(chuàng)建索引
上面創(chuàng)建了一個名字為article_test的索引,按照前面模板的定義規(guī)則,他會使用到前面定義的article_template模板,他的具體定義就會繼承模板中定義的相關(guān)設(shè)置,加上自己定義的設(shè)置
插入文檔
鍵入的數(shù)據(jù),包含了提前映射好的字段,然后也有沒有定義好的,比如字符串類型的,這個理論上就應(yīng)該使用動態(tài)模板映射,下面看看具體映射情況
可以看到,id字段是es默認(rèn)映射成了long類型,而title和content這類字符串字段,就是使用了前面動態(tài)模板設(shè)置的映射
插入的文檔
ps: 后面的一系列操作都是基于這幾條數(shù)據(jù)的
修改文檔
其實(shí)全數(shù)據(jù)的修改,可以把請求方式改成PUT,然后給一份新的文檔就修改了,還有一種修改方式是使用腳本的方式,具體請參考官網(wǎng)文檔
刪除文檔
可以看到文檔ID為1的數(shù)據(jù)已經(jīng)被刪除了
查詢文檔
簡單查詢
條件查詢
查詢?nèi)繑?shù)據(jù)
限制數(shù)據(jù)條數(shù)
查詢排序
關(guān)鍵字查詢
聚合查詢
單個分組聚合
多個分組聚合
其他聚合類函數(shù)的使用
上面用到的函數(shù)關(guān)鍵之是"stats",同樣的count,min,max,avg,sum都可以使用,比如下面
子條件查詢
定義: 以特定字段查詢所指特定值
Query Context
在查詢過程中,除了判斷文檔是否滿足查詢條件外,ES還會計(jì)算一個_score來標(biāo)示匹配程度,旨在判斷目標(biāo)文檔和查詢條件匹配得有多好
1. 全文本查詢: 針對文本類型的數(shù)據(jù)
模糊匹配(也即是前面的關(guān)鍵字匹配)
短語匹配
在常規(guī)的關(guān)鍵字查詢中,是按照設(shè)定的分詞器分詞后,查詢出包含各個分詞的數(shù)據(jù),查詢"elasticsearch安裝",會查詢出包含"elasticsearch"和"安裝"的全部結(jié)果(如上圖),如果使用短語匹配的話,就只會包含"elasticsearch安裝"的結(jié)果
多條件查詢
語法查詢
使用query_string + AND、OR關(guān)鍵字
上面在query中出現(xiàn)的AND、OR可以單個或者多個出現(xiàn),fields是制定查具體的字段,也可以不指定
2. 字段級別的查詢: 針對結(jié)構(gòu)化數(shù)據(jù),如數(shù)字累颂、日期等
范圍查詢 (對數(shù)字、日期屬性)
可以使用 gt(大于),lt(小于),gte(大于等于),lte(小于等于)
使用term關(guān)鍵字查詢
前面都是使用的match進(jìn)行查詢,他的查詢本身的關(guān)鍵字就會被分詞,比如搜索一個 [elasticsearch安裝與配置介紹],他會把這句話分解成[elasticsearch],[安裝],[與],[配置],[介紹]這幾個短語,然后在整個文檔中(也是被分詞的結(jié)構(gòu))去匹配這幾個短語,是分開匹配多個的
使用term的時(shí)候,他會把 [elasticsearch安裝與配置介紹] 這句話按照一個整體去匹配的,而文檔使用了分詞,所以通常是匹配不到的
要查詢到數(shù)據(jù),除非是你要搜索的數(shù)據(jù)已經(jīng)是分詞的最小單位了,比如只查詢一個"安裝"
或者就直接查詢文檔不分詞的字段,比如keyword類型的字段
前面已經(jīng)說了,es6之后已經(jīng)默認(rèn)把字符串類型的字段映射成了text和keyword兩種類型了,所以字符串text類型的字段,你也可以使用不分詞的形式
Filter Context
在查詢的過程中只判斷該文檔是個滿足條件,只有Yes或No(最直接體現(xiàn)就是查詢的結(jié)果score這一項(xiàng)都是0,沒有計(jì)算),而且filter會自動被緩存,所以他的效率比前面說的match要高.filter必須結(jié)合bool使用
符合條件查詢
定義: 以一定的邏輯組合的子條件查詢
固定分?jǐn)?shù)查詢
布爾查詢
must:?返回的文檔必須滿足must子句的條件,并且參與計(jì)算分值
must_not:?和must相反.必須不的意思
filter: 返回的文檔必須滿足filter子句的條件,結(jié)果不會計(jì)算分?jǐn)?shù),例子就是上面的?Filter Context
should:?返回的文檔可能滿足should子句的條件紊馏。
ps: 在一個Bool查詢中料饥,如果沒有must或者filter,有一個或者多個should子句朱监,那么只要滿足一個就可以返回岸啡。minimum_should_match參數(shù)定義了至少滿足幾個子句。
上面的查詢還可以組合使用
總結(jié)
好記性不如爛筆頭,本文主要是在學(xué)習(xí)的時(shí)候的一些簡單記錄,方便以后使用的時(shí)候查詢.ES的功能非常的強(qiáng)大,詳細(xì)的還是需要參考官網(wǎng)的文檔https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html.學(xué)以致用,最重要的是要能在自己工作中的業(yè)務(wù)場景靈活使用,我工作主要使用的語言是PHP,這里有我簡單的記錄了一篇Laravel中使用ElasticSearch,后續(xù)我工作中用到的比較經(jīng)典的場景,我會繼續(xù)記錄