ElasticSearch入門級教程(一)基本且常用的語法

0.首

對ES的起源、簡介等就不贅述了,查看官方文檔或者權威指南會更好一些,本章只記錄一些偏操作性的基本的東西以供自己複習

1.索引

#創建索引
PUT /player
#刪除索引
DELETE /player
#查看所有索引
GET /_cat/indices?v
在這裏插入圖片描述

green- 一切都很好(集羣功能齊全)
yellow- 所有數據均可用,但尚未分配一些副本(羣集功能齊全)
red- 某些數據由於某種原因不可用(羣集部分功能)

在Elasticsearch中,文檔歸屬於一種類型(type),而這些類型存在於索引(index)中,我們可以畫一些簡單的對比圖來類比傳統關係型數據庫:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Elasticsearch集羣可以包含多個索引(indices)(數據庫),每一個索引可以包含多個類型(types)(表),每一個類型包含多個文檔(documents)(行),然後每個文檔包含多個字段(Fields)(列)。

「索引」含義的區分
你可能已經注意到索引(index)這個詞在Elasticsearch中有着不同的含義,所以有必要在此做一下區分:
索引(名詞) 如上文所述,一個索引(index)就像是傳統關係數據庫中的數據庫,它是相關文檔存儲的地方,index的複數是indices 或indexes。
索引(動詞) 「索引一個文檔」表示把一個文檔存儲到索引(名詞)裏,以便它可以被檢索或者查詢。這很像SQL中的INSERT關鍵字,差別是,如果文檔已經存在,新的文檔將覆蓋舊的文檔。
倒排索引 傳統數據庫爲特定列增加一個索引,例如B-Tree索引來加速檢索。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的數據結構來達到相同目的。
---- 引自《ElasticSearch權威指南》

#索引文檔內容到player索引中
#PUT 索引名/類型名/id
PUT /player/_doc/1
{
“name”:“ferpusi”,
“age”:“20”,
“skill”:“swing”
}
在這裏插入圖片描述
多索引幾條數據
在這裏插入圖片描述

2.更新

第一種方法是重新索引,會覆蓋掉原來的內容
在這裏插入圖片描述
第二種是使用update,這種不會完全覆蓋,只更新指定的數據,如下只更新name,age、skill不會變。
POST /player/_doc/4/_update
{
“doc”: {“name”:“boertr”}
}
在這裏插入圖片描述

3.批處理

我們上面索引多個數據時,是逐個索引的,也可以批量來處理。示例中批量添加了id爲5、6的兩組數據
在這裏插入圖片描述

也可以批量進行更新、刪除等,更新是隻更新指定的內容;而刪除只需要指定id,刪除的是匹配該id下的全部內容
在這裏插入圖片描述

4.查詢

直接寫一個覆蓋比較多的常用查詢,就不拆開來寫了
GET /player/_search
{
“query”: {“match”: {
“name”: “kobe”

}} <1>
, “sort”: [
{
“age.keyword”: {
“order”: “asc”
}
}
] <2>
, “size”: 20 <3>
, “_source”: [“name”,“skill”] <4>
}
<1>:匹配name=kobe的內容
<2>:根據age排序
<3>:限制返回20條數據
<4>:只返回name、skill兩個字段

從sql角度轉化看,類似於這樣:
select name,skill from player where name = “kobe” sort by age asc limit 20
結果:
在這裏插入圖片描述
再說一下bool查詢, bool的話理解成true或false,也就是我們的查詢語句會涉及到true、false。
bool should查詢,類似於or,以下爲例:name=kobe 或者name=brant的會被匹配到,name=kobe brant的也會被匹配到
在這裏插入圖片描述
bool must查詢,理解成and,以下爲例,name中必須包含brant和kobe纔算匹配上,name=kobe name=brant的都不會命中。
在這裏插入圖片描述
還有bool must_not,代表不包含指定內容,這個就不演示了。
我們演示下組合起來的查詢,name必須匹配到kobe,age必須不能等於20
在這裏插入圖片描述
還可以組合filter(過濾)使用,如下
在這裏插入圖片描述

5.聚合

聚合單獨拉出來看
類似於sql中的group by等聚合函數,以下爲例,對age聚合,結果分爲兩部分,第一部分是正常的查詢結果,而聚合結果作爲第二部分單獨展示出來,如截圖中框選部分。*customname處填寫的是自定義的名字
在這裏插入圖片描述
如果只想看聚合結果,只需要加size=0即可。
在這裏插入圖片描述
再看一下avg這樣的聚合,用剛纔的索引來做avg聚合的話,會發現報了“Expected numeric type on field [age.keyword], but got [keyword]”這樣的錯,這是因爲

【在進行avg和sum等Metrics Aggregations(度量聚合)的時候報錯的,進行數學維度的計算,期望得到一個數字字段,但是得到的是一個String的keyword類型,若把my_field.keyword換成my_field,則又會包上一個錯誤。則需要在index數據之前進行mapping配置,將該字段的值定義爲numeric,或者開啓mapping的Numeric detection(數字探測)】

在這裏插入圖片描述
重新添加索引,開啓mapping的Numeric detection

PUT aggagg
{
  "mappings": {"_doc":{"numeric_detection": true}}
}

然後按之前的方式添加數據,這裏我加了兩條,然後開始聚合,可以看到,已經成功計算出avg了
在這裏插入圖片描述
聚合中的嵌套是逐層嵌套,有依賴關係的,這一點要注意。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章