ElasticSearch基本用法
ElasticSearch的RESTFul API基本格式:
http://<ip>:<port>/<索引>/<類型>/<文檔id>
- 常用HTTP動詞:GET / POST / PUT / DELETE
1.非結構化的創建索引:
創建索引完成後,可以在概覽頁面中查看到分片的信息,細框的分片是粗框分片的備份或者說副本:
我們通過查看索引信息來確定該索引是非結構化還是結構化的:
2.以上我們創建了非結構化的索引,以及知道了如何查看索引信息。接下來我們創建結構化的索引,進入復合查詢頁面,指定一個索引,並編寫結構化的數據,最後提交請求:
成功後,查看索引信息,可以看到我們所編寫的結構化數據,這種就是結構化的索引:
3.其實使用es-head插件來創建結構化索引並不是很方便,編寫JSON格式的結構化數據時比較蛋疼,沒有智能的格式化功能。我們也可以使用postman來創建結構化的索引,基本上只要能模擬http請求的工具,都能用來創建es的結構化索引。如下:
上圖中的ip和端口為es服務的ip及端口,people則是需要創建的索引名稱。
映射的JSON數據如下:
{ "settings": { "number_of_shards": 3, // 分片的數量 "number_of_replicas": 1 // 副本的數量 }, "mappings": { // 索引所映射的結構化數據 "man": { "properties": { "name": { "type": "text" }, "country": { "type": "keyword" }, "age": { "type": "integer" }, "date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } }, "woman": { } } }
提交請求成功後所反饋的信息:
可以到es-head的概覽界面上,查看到新創建的索引:
插入
es的插入分為:
- 指定文檔id插入
- 自動產生文檔id插入
指定文檔id插入,示例:
簡單說明:
- people 索引
- man 類型
- 1 文檔id
發送請求成功,即成功指定文檔id插入數據:
到es-head的數據瀏覽頁面上,可以看到我們剛剛插入的數據:
以上就是指定文檔id的方式插入數據,接下來我們看看如何讓es自動產生文檔id來插入數據:
發送請求成功,es自動生成的id如下:
到es-head的數據瀏覽頁面上,驗證我們剛剛插入的數據:
修改
es有兩種修改文檔數據的方式:
- 直接修改文檔
- 腳本修改文檔
直接修改文檔的方式,示例:
修改成功,返回信息如下:
文檔id為1的name數據成功修改為test_name:
腳本修改文檔的方式,示例:
註:es支持多種腳本語言,這裏只是拿了lang來做例子
修改成功,返回信息如下:
因為當時設置age的值時,設置成了字符串類型,而字符串的相加是連接,所以文檔id為1的age數據變成了2010:
我們還可以把數據放到外面,放在params裏面,然後在腳本代碼裏引用這個數據即可,如下示例:
修改成功後,如下:
刪除
關於es的刪除操作,我們主要介紹以下兩種:
- 刪除文檔
- 刪除索引
刪除文檔,示例:
此時就只剩一個文檔數據了:
在es-head上,刪除索引,示例:
確認刪除:
刪除成功,索引下的所有數據都會被刪除:
使用postman等工具,刪除索引,示例:
刪除成功:
註:刪除索引是一個非常危險的操作,需要謹慎刪除,免得刪庫跑路。
查詢
es常用的查詢語法:
- 簡單查詢
- 條件查詢
- 聚合查詢
我這裏已經事先準備好了一個結構化的索引:
以及一些數據:
簡單查詢,就是直接使用GET方式訪問需要查詢的 索引->類型->文檔id 即可,示例:
條件查詢,我們來查詢book索引下的所有數據:
查詢結果如下:
簡單說明:
- took 查詢耗時
- time_out 是否超時
- _shards 分片信息
- hits 本次查詢的數據都放在這裏,默認只包含十條數據
我們可以通過如下兩個參數來定義查詢多少條數據,例如我指定只查詢一條數據:
查詢結果如下:
通過關鍵字進行模糊查詢:
查詢結果如下:
我們可以指定排序查詢結果的方式,示例:
以上我們介紹了簡單查詢及條件查詢,接下來我們簡單介紹一下聚合查詢,單組聚合查詢示例:
{
"aggs": {
"group_by_word_count": {
"terms": {
"field": "word_count"
}
}
}
}
查詢的聚合結果如下:
多組聚合查詢示例:
{
"aggs": {
"group_by_word_count": {
"terms": {
"field": "word_count"
}
},
"group_by_publish_date": {
"terms": {
"field": "publish_date"
}
}
}
}
查詢的聚合結果如下:
{
...
"aggregations": {
"group_by_publish_date": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 981158400000,
"key_as_string": "2001-02-03 00:00:00",
"doc_count": 1
},
{
"key": 994809600000,
"key_as_string": "2001-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1107388800000,
"key_as_string": "2005-02-03 00:00:00",
"doc_count": 1
},
{
"key": 1121040000000,
"key_as_string": "2005-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1215734400000,
"key_as_string": "2008-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1278806400000,
"key_as_string": "2010-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1310342400000,
"key_as_string": "2011-07-11 00:00:00",
"doc_count": 1
},
{
"key": 1341964800000,
"key_as_string": "2012-07-11 00:00:00",
"doc_count": 1
}
]
},
"group_by_word_count": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 195616,
"doc_count": 2
},
{
"key": 1000,
"doc_count": 1
},
{
"key": 5000,
"doc_count": 1
},
{
"key": 26000,
"doc_count": 1
},
{
"key": 63056,
"doc_count": 1
},
{
"key": 69056,
"doc_count": 1
},
{
"key": 1233616,
"doc_count": 1
}
]
}
}
}
除了可以分組聚合查詢外,還可以進行統計查詢等,與數據庫中的聚合函數有些相似,如下示例:
{
"aggs": {
"grades_word_count": {
"stats": {
"field": "word_count" // 以word_count作為統計字段
}
}
}
}
查詢的統計結果如下:
{
...
"aggregations": {
"grades_word_count": {
"count": 8,
"min": 1000,
"max": 1233616,
"avg": 223620,
"sum": 1788960
}
}
}
ElasticSearch基本用法