ElasticSearch之基本用法API

weixin_33924312發表於2018-10-02

索引的建立

ElasticSearch的RESTFul API基本格式:

  • http://<ip>:<port>/<索引>/<型別>/<文件id>
  • 常用HTTP動詞:GET / POST / PUT / DELETE
  1. 非結構化的建立索引:

建立索引完成後,可以在概覽頁面中檢視到分片的資訊,細框的分片是粗框分片的備份或者說副本:

我們通過檢視索引資訊來確定該索引是非結構化還是結構化的:

  1. 以上我們建立了非結構化的索引,以及知道了如何檢視索引資訊。接下來我們建立結構化的索引,進入複合查詢頁面,指定一個索引,並編寫結構化的資料,最後提交請求:

成功後,檢視索引資訊,可以看到我們所編寫的結構化資料,這種就是結構化的索引:

  1. 其實使用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
        }
    }
}    
複製程式碼

本文來源 blog.51cto.com/zero01/2130…

相關文章