Elasticsearch一款基於Apache Lucene™開源搜索引擎,其核心是迄今爲止最先進、性能最好的、功能最全的搜索引擎庫Lucene。Elasticsearch使用簡單,具有非常強大的全文搜索功能:
- 分佈式的實時文件存儲,每個字段都被索引並可被搜索
- 分佈式的實時分析搜索引擎
- 可以擴展到上百臺服務器,處理PB級結構化或非結構化數據
ElasticSearch中使用到的概念
準實時
Elasticsearch是一個準實時系統:一個文檔從存儲到它能夠被檢索只有一個很短的延遲(通常情況下爲一秒)。
集羣(Cluster)
爲所有數據提供存儲和檢索等服務的結點(服務器)集合。默認的名字爲“elasticsearch”,結點(服務器)也依據名字被指定要加入哪個集羣。
結點(Node)
作爲集羣的一部分,爲數據提供存儲和檢索服務的一臺服務器。
索引(Index)
索引的概念類似於關係數據庫中的數據庫,是相關文檔存儲的地方。相應的,“索引一個文檔”表示把一個文檔存儲在某個索引中。
類型(Type)
索引中文檔的邏輯分類,類似於關係數據庫中的表。
Elasticsearch 6.0.0.已經不支持在一個索引中建立多個類型,在以後版本中會移除類型這一個概念。
文檔(Document)
一條完整的記錄,類似於關係數據庫中的元組。
域(Fields)
類似於關係數據庫中的屬性。
倒排索引
Elasticsearch會爲文檔中的每個字段都建立倒排索引,這是它實現高效搜索的基礎之一。
ElasticSearch類比傳統數據庫
Relational DB | Elasticsearch |
---|---|
Databases | Indices |
Tables | Types |
Rows | Documents |
Columns | Fields |
安裝
Elasticsearch 需要 Java8 或更新的 Java 環境。Java 下載
下載 Elasticsearch 6.0.1 壓縮包並解壓
$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gz
$ tar -xvf elasticsearch-6.0.1.tar.gz
啓動
$ cd elasticsearch-6.0.1/bin
$ ./elasticsearch
如果你不想使用默認的集羣名和結點名,可以在啓動時指定相應的參數:
$ ./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name
交互
Elasticsearch啓動後是一個 http 服務,默認在本地的 9200 端口。可以通過 curl 或者 Kibana 控制檯進行操作。使用 curl 的命令格式如下:
$ curl -X<VERB> '<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
- VERB:HTTP 方法,如 GET、POST、PUT、HEAD、DELETE
- PROTOCOL:http 或者 https 協議
- HOST: Elasticsearch集羣中的任何一個節點的主機名,如果是在本地的節點,那麼就叫localhost
- PORT: Elasticsearch HTTP服務所在的端口,默認爲 9200
- PATH: API路徑
- QUERY_STRING: 一些可選的查詢請求參數,例如
?pretty
參數將使請求返回更加美觀易讀的JSON數據 - BODY: 一個JSON格式的請求主體(如果請求需要的話)
例. 查詢集羣中結點的健康狀況
$ curl -X GET "localhost:9200/_cat/health?v"
- 綠色:一切安好
- 黃色:所有結點均可用,某些結點沒有備份
- 紅色:某些結點不可用
增
添加一個名爲“customer”的索引
$ curl -X PUT "localhost:9200/customer?pretty"
查看現有的所有索引
$ curl -X GET "localhost:9200/_cat/indices?v"
在索引“customer”中添加一個 ID 爲 1 顧客的信息,即一個文檔(文檔類型爲 doc)
$ curl -X PUT "localhost:9200/customer/doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "John Doe"
}
'
查看顧客1的信息
$ curl -X GET "localhost:9200/customer/doc/1?pretty"
改
將顧客1的姓名改爲 “Jane Doe”
$ curl -X PUT "localhost:9200/customer/doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name": "Jane Doe"
}
'
查看顧客1的信息
$ curl -X GET "localhost:9200/customer/doc/1?pretty"
爲顧客1添加一項年齡屬性
$ curl -X POST "localhost:9200/customer/doc/1/_update?pretty" -H 'Content-Type: application/json' -d'
{
"doc": { "name": "Jane Doe", "age": 20 }
}
'
刪
刪除“customer”索引
$ curl -X DELETE "localhost:9200/customer?pretty"
查看現有的所有索引
$ curl -X GET "localhost:9200/_cat/indices?v"
批處理
_bulk
API 可以幫助我們一次進行多項操作。添加兩個顧客 John Doe 和 Jane Doe
$ curl -X POST "localhost:9200/customer/doc/_bulk?pretty" -H 'Content-Type: application/json' -d'
{"index":{"_id":"1"}}
{"name": "John Doe" }
{"index":{"_id":"2"}}
{"name": "Jane Doe" }
'
將顧客1的名字改爲 Jane Done, 並刪除顧客2的信息
$ curl -X POST "localhost:9200/customer/doc/_bulk?pretty" -H 'Content-Type: application/json' -d'
{"update":{"_id":"1"}}
{"doc": { "name": "John Doe becomes Jane Doe" } }
{"delete":{"_id":"2"}}
'
查詢
上面已經介紹瞭如何使用 curl 進行簡單的查詢。若要對數據進行復雜查詢與分析,推薦結合使用 Kibana。
kibana簡介
Kibana是一個與Elasticsearch協同工作的開源分析和可視化平臺,Kibana 可以讓你更方便地對 Elasticsearch 中數據進行操作,包括高級的數據分析以及在圖表中可視化您的數據。
安裝
Kibana 的主版本號和次版本號不要超過 Elasticsearch,最好使用同版本號的 Kibana 與 Elasticsearch。
下載 Kibana 6.0.1壓縮包並解壓
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-linux-x86_64.tar.gz
$ tar -xzf kibana-6.0.1-linux-x86_64.tar.gz
啓動
$ cd kibana-6.0.1-linux-x86_64/
$ ./bin/kibana
Kibana 默認運行在 5601 端口,打開瀏覽器訪問 localhost:5601 即可看到 Kibana 控制檯,打開 Dev Tools 便籤欄即可與 Elasticsearch 進行交互。
準備數據
在體驗Kibana之前先讓我們準備一些更加複雜的數據,以便更好地體現出Kibana的效果。官網上有三個數據集可供使用:shakespeare.json、accounts.zip、logs.jsonl.gz。這裏我們選擇其中的accounts.zip、logs.jsonl.gz。
下載完成後需要解壓
$ unzip accounts.zip
$ gunzip logs.jsonl.gz
在我們導入數據集前,需要先指定一些數據域的屬性。
logs 數據的結構很複雜,此次示例我們只關心以下幾個域:
{
"memory": INT,
"geo.coordinates": "geo_point"
"@timestamp": "date"
}
在 Kibana的Dev Tools 控制檯中輸入一下命令對其中某些域指定特性:
PUT /logstash-2015.05.18
{
"mappings": {
"log": {
"properties": {
"geo": {
"properties": {
"coordinates": {
"type": "geo_point"
}
}
}
}
}
}
}
PUT /logstash-2015.05.19
{
"mappings": {
"log": {
"properties": {
"geo": {
"properties": {
"coordinates": {
"type": "geo_point"
}
}
}
}
}
}
}
PUT /logstash-2015.05.20
{
"mappings": {
"log": {
"properties": {
"geo": {
"properties": {
"coordinates": {
"type": "geo_point"
}
}
}
}
}
}
}
accounts 數據不需要指定域特性,現在我們已經準備好了,可以向 Elasticsearch 導入數據了,在放有三個解壓好的數據文件的同級目錄下運行以下shell命令:
curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json
curl -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/_bulk?pretty' --data-binary @logs.jsonl
等待數據導入完成,再看一眼是否導入成功:
GET /_cat/indices?v
制定索引模式
在正常的使用過程中,你的Elasticsearch庫中可能有非常多的索引,通過制定一些索引模式(即含有統配符的索引名匹配模板)可以在進行檢索時有效地制定搜索的範圍。在Kibana的 Management 標籤欄下添加新的索引模式,這裏我們添加了兩個索引模式:ba*、logstash*
shakespeare和accounts數據都是沒有時間信息的,所以在添加shakes*和ba*索引模式時“Index contains time-based events box ”一欄應該置爲空,logs數據集帶有時間信息,在添加logstash-*索引模式時在這一項選擇“@timestamp”。
索引模式可以自由制定,但必須保證所添加的索引模式能夠匹配到Elasticsearch中現有的某些索引,並且這些索引中還必須有數據。
在控制檯輸入 GET _cat/indices 可以查看 Elasticsearch中現存的所有索引。
檢索
進入 Kibana 的 Discover 標籤欄,通過在頂部的搜索框中輸入 Elasticsearch 查詢語句可以對數據進行各種檢索。當前使用的索引模式顯示在搜索欄下面,Elasticsearch只會在與當前的索引模式相匹配索引中執行搜索。
舉個例子,將當前的索引模式選擇爲 ba*,並在頂部的搜索欄中輸入:
account_number:<100 AND balance:>47500
來查詢 accounts 數據中 accounts_number 屬性小於100,並且balance屬性大於47500的文檔。
可以看到一共有五條文檔符合我們的檢索要求,Kibana默認會列出所有匹配文檔的所有域,通過將鼠標懸停在相關域點擊後面的“add”按鈕可以要查看的域進行篩選。
數據可視化
在 Kibana 的 Visualize 標籤欄下對你的數據進行可視化。
例:點擊“Create a visualization”新建一個數據視圖。Kibana 提供了多種數據視圖,這裏我們選擇餅圖,再選擇索引模式ba*。
在初始的默認值下,所有的文檔都被匹配上了,所以我們看到的是一個單色的餅圖。這裏我們使用Buckets聚合來將對數據的balance進行一下分析:
1.點擊“Split Slices”按鈕
2.在Aggregation列表中選擇Range選項
3.在Field列表中選擇balance選項
4.通過點擊“Add Range”按鈕,制定6個區間
5.每個區間的範圍值如下
0 | 999 |
---|---|
1000 | 2999 |
3000 | 6999 |
7000 | 14999 |
15000 | 30999 |
31000 | 50000 |
6.點擊“Apply changes”顯示分析結果
下面讓我進行更進一步的分析,通過以下操作,我們來分析一下每個 balance range中開戶人的年齡分佈情況:
1.點擊bucket列表下的“Add sub-buckets”按鈕,新建一列子buckets
2.點擊“Split Slices”按鈕
3.在Aggregation列表中選擇“Term”選項
4.在Field列表中選擇age選項
5.在Order By中選擇metric:Count選項
6.在Order中選擇Descending,Size默認爲5
7.點擊“Apply changes”顯示分析結果
將鼠標懸停在相關區域可以顯示更多信息,在Custom Label欄中可以爲我們的座標起名字,點擊右上角的Save按鈕可以保存我們的視圖。
下面我們來對log數據進行一些分析:
1.點擊左上角的Visualize按鈕,回到Visualize標籤欄的根目錄,添加一個新的視圖
2.選擇Coordinate Map 視圖
3.選擇logstash-*索引模式
4.點擊右上角的時間信息,打開時間過濾器
5.我們選擇查看2015.5.18到2015.5.20的信息
6.點擊Go按鈕,應用我們的時間過濾器
7.在buckets中選擇Geo Coordinate指定我們要查詢的內容,並點擊Apply changes使查詢生效
Kibana還支持繪製直方圖,折線圖等多種多樣的視圖以及更高級的數據可視化功能。
更多詳情請參考:
可能遇到的問題
can not run elasticsearch as root
切換到非root用戶
main ERROR Could not register mbeans java.security.AccessControlException: access denied (“javax.management.MBeanTrustPermission” “register”)
改變elasticsearch文件夾所有者到當前用戶:
$ sudo chown -R user_name elasticsearch