Elasticsearch:一套資料搜尋分析系統
最近接觸了 Elasticsearch 這套系統,它能夠以 JSON 的形式儲存資料,並且去做即時的分析和搜尋。那它和 MySQL 資料庫有什麼不一樣呢?
MySQL 屬於 RDBMS 的資料庫,但 Elasticsearch 比較算是搜尋引擎,而且 Elasticsearch 的安裝簡單,可以透過 HTTP 並使用 JSON 來處理資料。
概念釐清
由於 Elasticsearch 和一般 RDBMS 架構不同,所以在名詞上也不太一樣。和 MySQL 比照的話大概是這樣:
MySQL:Server→Databases→Tables→Rows→Columns
Elasticsearch:Node→Indices→Types→Documents→Fields
註:indices 是 index 的複數。
另外,Elasticsearch 是使用 JSON 的巢狀結構,不是二維表格。
安裝 Elasticsearch
這裡以 Linux 環境為例。不過 Windows、Mac 都有相對應版本。
Elasticsearch 是用 Java 寫的,所以執行環境需要有 jre。
apt-get install openjdk-7-jre
接著到 Elastichsearch 的下載頁面取得最新版本的連結(一般來說選 tar.gz 版本),之後用 wget
下載下來,例如:
wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.1.1/elasticsearch-2.1.1.tar.gz
接著解壓縮(記得把2.1.1替換成你下載的版本)。
tar zxf elasticsearch-2.1.1.tar.gz
切換到 elasticsearch
目錄後,可以直接執行 Elasticsearch。
./bin/elasticsearch
也可以加上 -f
選項讓 Elasticsearch 在後台運作。
操作 Elasticsearch
看到 Started 字樣後,就代表 Elacsticsearch 已經啟動完成。由於 Elasticsearch 是用 Java 寫的,當然有提供它的 Java API,不過在這邊我還是選擇用比較簡單的 RESTful API 來操作。
- 到這裡不懂 RESTful API 沒關係,只要知道等等可以用 curl 來操作就好。不過,你還是看一下什麼叫做 HTTP Method 好了:淺談 HTTP Method:表單中的 GET 與 POST 有什麼差別? – Soul & Shell Blog
- Elasticsearch 預設開啟的 port 是 9200,有需要的話可以到 config/elasticsearch.yml 來修改。
操作 Elasticsearch 的格式基本上是這樣:
curl -X<method> ‘http://<server>:<port>/<index>/<type>/[<id>]
接著來試著新增一些資料到 Elasticsearch 上吧!例如我們建立一個 twitter 的 user (Elasticsearch 會自動幫我們建立索引):
curl -XPUT 'http://192.168.16.9:9200/twitter/user/Noob?pretty' -d '{"name": "Noob"}'
?pretty 是什麼?你可以不要加試試看,加了只是會讓它回應的排版變比較美而已 XD
可以用 GET 方法來取得資料,例如:
curl -XGET 'http://192.168.16.9:9200/twitter/user/Noob?pretty'
既然叫做 Elasticsearch,最重要的應該還是搜尋吧?一樣是用 GET 方法,如果你有多筆資料,你可以這樣搜尋:
curl -XGET 'http://192.168.16.9:9200/twitter/tweet/_search?pretty'
這些回傳的資料都是巢狀的 JSON 格式,會很好處理。當然還有其他搜尋的方式,可以參考官方文件看看。
最後,如果對 Elasticsearch 有興趣,可以看看 GitHub 上的文件:elastic/elasticsearch。