ElasticSearch的簡單使用

本文是基于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ù)記錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赫编,一起剝皮案震驚了整個濱河市巡蘸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擂送,老刑警劉巖悦荒,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘹吨,居然都是意外死亡搬味,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蟀拷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碰纬,“玉大人,你說我怎么就攤上這事匹厘。” “怎么了脐区?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵愈诚,是天一觀的道長。 經(jīng)常有香客問我牛隅,道長炕柔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任媒佣,我火速辦了婚禮匕累,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘默伍。我一直安慰自己欢嘿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布也糊。 她就那樣靜靜地躺著炼蹦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狸剃。 梳的紋絲不亂的頭發(fā)上掐隐,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼虑省。 笑死匿刮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的探颈。 我是一名探鬼主播熟丸,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膝擂!你這毒婦竟也來了虑啤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤架馋,失蹤者是張志新(化名)和其女友劉穎狞山,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叉寂,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萍启,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屏鳍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勘纯。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钓瞭,靈堂內(nèi)的尸體忽然破棺而出驳遵,到底是詐尸還是另有隱情,我是刑警寧澤山涡,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布堤结,位于F島的核電站,受9級特大地震影響鸭丛,放射性物質(zhì)發(fā)生泄漏竞穷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一鳞溉、第九天 我趴在偏房一處隱蔽的房頂上張望瘾带。 院中可真熱鬧,春花似錦熟菲、人聲如沸看政。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帽衙。三九已至,卻和暖如春贞绵,著一層夾襖步出監(jiān)牢的瞬間厉萝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谴垫,地道東北人章母。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像翩剪,于是被迫代替她去往敵國和親乳怎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355