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.

Elastic


所以呢, 上面範例就是我們把一筆資料, 放到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
他可以有更多的組合, 但是剛開始接觸到的時候真的會有種讓人想吐的感覺.
所以之後再介紹啦~~