elasticsearch之簡單使用
一、elasticsearch基本概念
在Elasticsearch中存儲數據的行爲就叫做索引(indexing),不過在索引之前,我們需要明確數據應該存儲在哪裏。
在Elasticsearch中,文檔歸屬於一種類型(type),而這些類型存在於索引(index)中,我們可以畫一些簡單的對比圖來類比傳統關係型數據庫:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Elasticsearch集羣可以包含多個索引(indices)(數據庫),每一個索引可以包含多個類型(types)(表),每一個類型包含多個文檔(documents)(行),然後每個文檔包含多個字段(Fields)(列)。
基於HTTP協議,以JSON爲數據交互格式的RESTful API
其他所有程序語言都可以使用RESTful API,通過9200端口的與Elasticsearch進行通信,你可以使用你喜歡的WEB客戶端,事實上,如你所見,你甚至可以通過
curl
命令與Elasticsearch通信。向Elasticsearch發出的請求的組成部分與其它普通的HTTP請求是一樣的:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
- VERB HTTP方法:
GET
,POST
,PUT
,HEAD
,DELETE
- PROTOCOL http或者https協議(只有在Elasticsearch前面有https代理的時候可用)
- HOST Elasticsearch集羣中的任何一個節點的主機名,如果是在本地的節點,那麼就叫localhost
- PORT Elasticsearch HTTP服務所在的端口,默認爲9200
- PATH API路徑(例如_count將返回集羣中文檔的數量),PATH可以包含多個組件,例如_cluster/stats或者_nodes/stats/jvm
- QUERY_STRING 一些可選的查詢請求參數,例如
?pretty
參數將使請求返回更加美觀易讀的JSON數據 - BODY 一個JSON格式的請求主體(如果請求需要的話)
二、基本使用
創建、查看索引:
curl -XPUT '172.17.150.27:9200/megacorp'
curl '172.17.150.27:9200/_cat/indices?v'
在索引裏面添加、查詢文檔
curl -XPUT '172.17.150.27:9200/megacorp/employee/1?pretty' -d
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}'
curl -i -XGET 'http://172.17.150.27:9200/megacorp/employee/1?pretty'
-i參數可以顯示Http頭部 pretty以美觀的格式顯示
判斷文檔是否存在:
curl -i -XHEAD 'http://172.17.150.27:9200/megacorp/employee/1?pretty'
刪除文檔
curl -i -XDELETE 'http://172.17.150.27:9200/megacorp/employee/1?pretty'
更新文檔,檔在Elasticsearch中是不可變的——我們不能修改他們。如果需要更新已存在的文檔,可以使用index api重建索引或者替換它
curl -XPUT '172.17.150.27:9200/megacorp/employee/1?pretty' -d
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music,sport" ,]
}'
可以看到,result值爲updated,說明更新了文檔,created值爲false,-version值加一
這個API 似乎 允許你修改文檔的局部,但事實上Elasticsearch遵循與之前所說完全相同的過程,這個過程如下:
- 從舊文檔中檢索JSON
- 修改它
- 刪除舊文檔
- 索引新文檔
也可以使用update api進行局部更新,更方便有效
curl -i -XPOST '172.17.150.27:9200/megacorp/employee/1/_update?pretty' -d '{"doc":{"interests": [ "sports", "music" ]}}'
查詢文檔數量與明細
curl -i -XGET '172.17.150.27:9200/megacorp/employee/_count?pretty'
curl -i -XGET '172.17.150.27:9200/megacorp/employee/_search?pretty'
Elasticsearch有一個功能叫做聚合(aggregations),它允許你在數據上生成複雜的分析統計。它很像SQL中的
GROUP
BY
但是功能更強大。
舉個例子,讓我們找到所有職員中最大的共同點(興趣愛好)是什麼:
GET /megacorp/employee/_search
{
"aggs": {
"all_interests": {
"terms": { "field": "interests" }
}
}
}
根據官方文檔顯示,出現該錯誤是因爲5.x之後,Elasticsearch對排序、聚合所依據的字段用單獨的數據結構(fielddata)緩存到內存裏了,但是在text字段上默認
是禁用的,如果有需要單獨開啓,這樣做的目的是爲了節省內存空間。
可以手動開啓text字段的使用,
curl -XPUT 'http://172.17.150.27:9200/megacorp/_mapping/employee' -d '{"properties":{"interests":{"type":"text","fielddata":true}}}'
再執行聚合命令
最後,elasticsearch的簡單使用就寫到這邊了,主要參考 https://www.gitbook.com/book/looly/elasticsearch-the-definitive-guide-cn