1. 程式人生 > >ElasticSearch基本用法

ElasticSearch基本用法

就是 clas 分片 shadow ror log 以及 引用 settings

索引的創建

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基本用法