es基本使用及部分騷操作

一飒责、基本屬性介紹

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就行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市永乌,隨后出現(xiàn)的幾起案子惑申,更是在濱河造成了極大的恐慌,老刑警劉巖翅雏,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圈驼,死亡現(xiàn)場離奇詭異,居然都是意外死亡望几,警方通過查閱死者的電腦和手機(jī)碗脊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄妆,“玉大人衙伶,你說我怎么就攤上這事『δ耄” “怎么了矢劲?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長慌随。 經(jīng)常有香客問我芬沉,道長,這世上最難降的妖魔是什么阁猜? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任丸逸,我火速辦了婚禮,結(jié)果婚禮上剃袍,老公的妹妹穿的比我還像新娘黄刚。我一直安慰自己,他們只是感情好民效,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布憔维。 她就那樣靜靜地躺著,像睡著了一般畏邢。 火紅的嫁衣襯著肌膚如雪业扒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天舒萎,我揣著相機(jī)與錄音程储,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛章鲤,可吹牛的內(nèi)容都是我干的致板。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼咏窿,長吁一口氣:“原來是場噩夢啊……” “哼斟或!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起集嵌,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤萝挤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后根欧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜珍,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年凤粗,在試婚紗的時候發(fā)現(xiàn)自己被綠了酥泛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫌拣,死狀恐怖柔袁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情异逐,我是刑警寧澤捶索,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站灰瞻,受9級特大地震影響腥例,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酝润,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一燎竖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧要销,春花似錦构回、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拨扶。三九已至凳鬓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間患民,已是汗流浹背缩举。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仅孩。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓托猩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辽慕。 傳聞我的和親對象是個殘疾皇子京腥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容