Hello World 系列 - Elasticsearch
示範環境: Ubuntu 16.04.4 LTS
首先, elasticsearch 需要 java, 所以我們就先安裝java
apt-get install python-software-properties
apt-get install software-properties-common
add-apt-repository ppa:webupd8team/java
apt-get update
apt-get install oracle-java8-installer
echo "export JAVA_HOME=/usr/lib/jvm/java-8-oracle" >> ~/.bashrc
echo "export JRE_HOME=/usr/lib/jvm/java-8-oracle/jre" >> ~/.bashrc
然後, 下載安裝elasticsearch
當然, 你也可以選擇自己想要的版本
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.deb
dpkg -i elasticsearch-6.2.4.deb
啟動他
systemctl start elasticsearch
過一下子沒問題的話就好囉 (這邊要稍微等一下, 請動jvm會需要一點時間)
Elasticsearch 是使用9200端口來和外部溝通, 9300端口和內部叢集溝通
所以這時候可以嘗試訪問自己的9200端口, 看到下面回應就是成功囉!
curl 127.0.0.1:9200
{
"name" : "akDI6VG",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "bNUREl11Ta67tOTSCD7TkQ",
"version" : {
"number" : "6.2.4",
"build_hash" : "ccec39f",
"build_date" : "2018-04-12T20:37:28.497551Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
好, 現在丟一點資料
root@ubuntu:~# curl -sH "Content-Type: Application/json" -XPOST
127.0.0.1:9200/user/doc -d '{"name": "John", "age": 18}' | jq .
{
"_index": "user",
"_type": "doc",
"_id": "kTirMGMBkXU3O_9hHgI8",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
現在來看剛剛丟的資料
root@ubuntu:~# curl -s 127.0.0.1:9200/user/_search | jq .
{
"took": 130,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "user",
"_type": "doc",
"_id": "kTirMGMBkXU3O_9hHgI8",
"_score": 1,
"_source": {
"name": "John",
"age": 18
}
}
]
}
}
好了~ 我們下次見
咳咳...
等等 所以剛剛都做了些什麼??
ok, 解釋下
curl -sH "Content-Type: Application/json" -XPOST 127.0.0.1:9200/user/doc -d ' { "name": "John", "age": 18 } ' | jq .
curl
: 指令介面的http請求客戶端
-s
: 安靜模式
H
: header, 請求表頭
Content-Type: Application/json
: 這就是表頭內容, 告訴對面我的資料內容是 Application/json
這個以前版本沒有嚴格規定的, 6.0以後則需要 參考連結
XPOST
: REST的動作之一, 就是.. POST 丟東西過去
127.0.0.1
: 你的Elasticsearch server
9200
: 他使用的端口
user
: 你的索引
doc
: type, 這東西7.0以後也都會被拿掉, 不用太在意 參考連結
-d
: data, 也就是你要丟的資料
{"name": "John", "age": 18}
: json 格式的資料; 名子: John, 年齡: 18
|
: pipe, 管道符
jq .
: jq 是處理json格式的工具, 沒有的朋友快去下載!
白話文
我對127.0.0.1, 端口9200; 丟一筆資料; 索引是user, 資料是"名子: John, 年齡: 18"
我在127.0.0.1, 端口9200; 的user這個索引, 做搜尋
等等.. 搜尋? 你丫的什麼條件都沒下也叫搜尋的嗎?索引又是個什麼?
先說索引吧
看一下下面的圖大家應該就理解了
以下是Elasticsearch的資料儲存樣貌
每一筆資料 都是一個document
, 若干document可以組成一個索引(Index)
, 再若干個索引, 就可以組成我們的Elasticsearch.
所以呢, 上面範例就是我們把一筆資料, 放到user這個索引裡面.
Elasticsearch 很聰明, 當他發現你原本沒這個索引, 就會自動創建一個啦~
使用下面指令可以查看你有那些索引, 可以看到我已經建了亂七八糟一堆了~
root@ubuntu:~# curl 127.0.0.1:9200/_cat/indices
yellow open yyindex U6hztrAMQQyzYp5TQK2O2Q 5 1 1 0 4.8kb 4.8kb
green open ip-index 2WXsadRmQQWc1L3AyX14zA 1 0 1 0 3.4kb 3.4kb
yellow open my126index MYD8wvh5Tfah3m8oglh80Q 5 1 1 0 4.4kb 4.4kb
yellow open mynewindex BulQXxihSay98nQXdkZ6MA 5 1 0 0 1.2kb 1.2kb
yellow open test-index Qiqf7aCRQt2pOuDlk3z_jQ 5 1 26 0 96.7kb 96.7kb
yellow open my123index qcJi5J2PSOCe8hvU9WCeaQ 5 1 1 0 4.3kb 4.3kb
yellow open elastalert_status SRYTTQLlQMyRgDz4s-ynmw 5 1 10337 0 2.2mb 2.2mb
yellow open myin1dex I2WYTpRySuif6UBHPUQxWQ 5 1 0 0 1.2kb 1.2kb
yellow open my125index 3nGzllC1RvKZiYj2Nzrd0A 5 1 1 0 4.4kb 4.4kb
yellow open my77index nZg4mpm5Sk-q_0rjOoe6rw 5 1 1 0 4.8kb 4.8kb
yellow open user umUK-rX6TOKnFgNFMEHJKg 5 1 1 0 4.6kb 4.6kb
yellow open myindex123 wRApGh7VS7WjaJDNhSokGw 5 1 2 0 7.1kb 7.1kb
yellow open myindx 5i2xp1ISQWK63atse2NAtA 5 1 0 0 1.2kb 1.2kb
那麼搜尋呢?
ok, 這邊示範下 Elasticsearch 的 URI Search
先再貼一些資料
curl -sH "Content-Type: Application/json" -XPOST 127.0.0.1:9200/user/doc -d '{"name": "Joff", "age": 50}'
curl -sH "Content-Type: Application/json" -XPOST 127.0.0.1:9200/user/doc -d '{"name": "Tux", "age": 4}'
curl -sH "Content-Type: Application/json" -XPOST 127.0.0.1:9200/user/doc -d '{"name": "Apple", "age": 31}'
然後測試下搜尋, 比如我想把Jo開頭的人都找出來
root@ubuntu:~# curl -s "127.0.0.1:9200/user/_search?q=name:jo*" | jq .
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "user",
"_type": "doc",
"_id": "kTirMGMBkXU3O_9hHgI8",
"_score": 1,
"_source": {
"name": "John",
"age": 18
}
},
{
"_index": "user",
"_type": "doc",
"_id": "kjjrMGMBkXU3O_9hhQI3",
"_score": 1,
"_source": {
"name": "Joff",
"age": 50
}
}
]
}
}
成功啦~
比照辦理, 歲數呢
root@ubuntu:~# curl -s "127.0.0.1:9200/user/_search?q=age:3*" | jq .
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
尼瑪竟然抓不到, why~~~~
因為資料型態不同的關係啦, 所以他不能使用這種萬用字元哦
詳細請看資料映射
因為不在Hello World 範疇裡面, 就不示範了哦, 請自行移駕 ^__^
備註:
其實更多時候, 我們會用Request Body Search
他可以有更多的組合, 但是剛開始接觸到的時候真的會有種讓人想吐的感覺.
所以之後再介紹啦~~