索引的建立
ElasticSearch的RESTFul API基本格式:
http://<ip>:<port>/<索引>/<型別>/<文件id>
- 常用HTTP動詞:GET / POST / PUT / DELETE
- 非結構化的建立索引:
建立索引完成後,可以在概覽頁面中檢視到分片的資訊,細框的分片是粗框分片的備份或者說副本:
我們通過檢視索引資訊來確定該索引是非結構化還是結構化的:
- 以上我們建立了非結構化的索引,以及知道了如何檢視索引資訊。接下來我們建立結構化的索引,進入複合查詢頁面,指定一個索引,並編寫結構化的資料,最後提交請求:
成功後,檢視索引資訊,可以看到我們所編寫的結構化資料,這種就是結構化的索引:
- 其實使用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
}
}
}
複製程式碼