1. 程式人生 > >Elasticsearch 別管原理,先run起來

Elasticsearch 別管原理,先run起來

少點程式碼,多點頭髮

本文已經收錄至我的GitHub,歡迎大家踴躍star 和 issues。

https://github.com/midou-tech/articles

看文章有兩點需要注意:

  • 本公號講解的Elasticsearch是基於7.7.0版本,你們在閱讀一些相關書籍和部落格注意版本,不同版本很多概念會有出入。

  • 文章寫作過程中會經常將Elasticsearch簡寫為Es,閱讀過程中需要注意。

一般學習一個新的技術或者產品,第一步就是用起來。什麼設計理論,框架原始碼,都別和我談,先run起來。這也是在公司看別人專案的絕招。

用起來,有一個很明顯的點,是你能感受到他,不然天天看理論知識,看原始碼會讓你覺得你好像懂了,但又心裡沒底,最終會導致你走火入魔。

今天龍叔的主題就是 學Es,先run起來,用起來之後在去探索內部更多問題和原理。

Elasticsearch

Elasticsearch安裝

Elasticsearch 的底層是開源庫 Lucene。但是,你沒法直接用 Lucene,必須自己寫程式碼去呼叫它的介面。Elasticsearch 是 Lucene 的封裝,提供了 REST API 的操作介面,開箱即用。

Elasticsearch 需要 Java 8 環境。如果你的機器還沒安裝 Java,可以在網上找個教程安裝,注意要保證環境變數JAVA_HOME正確設定。

安裝完 Java,就可以跟著 官方文件:https://www.elastic.co/guide/en/elasticsearch/reference/current/zip-targz.html 安裝 Elasticsearch。我這裡就直接下載壓縮包比較簡單。

#mac和linux上安裝教程一樣的
# 下載
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512
$ shasum -a 512 -c elasticsearch-7.7.0-darwin-x86_64.tar.gz.sha512 
#解壓
$ tar -xzf elasticsearch-7.7.0-darwin-x86_64.tar.gz
$ cd elasticsearch-7.7.0/

接著,進入解壓後的目錄,執行下面的命令,啟動 Elasticsearch。

$ ./bin/elasticsearch

如果一切正常,那可能是run起來了,Es預設開啟9200埠。測試下是否啟動成功,用 curl 工具測試(這個工具後面會寫一篇文章介紹,還有上面用的wget),也可以在瀏覽器訪問。

$ curl localhost:9200 #測試命令
{
  "name" : "MacBook-Pro.local",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "Z1NxCjE4T6CgTjZmpAVe_A",
  "version" : {
    "number" : "7.7.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
    "build_date" : "2020-05-12T02:01:37.602180Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

請求9200埠,Elastic 返回一個 JSON 物件,包含當前節點、叢集、版本等資訊。

收到這樣一個JSON物件,說明啟動成功。

安裝整體沒什麼壓力,java環境裝好,基本就是開箱即用。程式設計師最喜歡使用這樣的中介軟體,開箱即用,從不管箱子裡面是啥。

基本概念

本來run起來就準備說搞點資料進去,在和Es進行互動起來,但是正在準備寫資料進索引的時候,發現不對勁。

可能有人根本不知道什麼是索引?什麼Document。於是 就來了,先普及下基本概念。

節點(Node) 與叢集( Cluster)

Elastic 本質上是一個分散式資料庫,允許多臺伺服器協同工作,每臺伺服器可以執行多個 Elastic 例項。

單個 Elastic 例項稱為一個節點(node)。一組節點構成一個叢集(cluster)。

索引(Index)

Elastic 會索引所有欄位,經過處理後寫入一個反向索引(Inverted Index),也經常稱之為倒排索引。查詢資料的時候,直接查詢該索引。

Elastic 資料管理的頂層單位就叫做 Index(索引)。它是單個數據庫的同義詞。每個 Index (即資料庫)的名字必須是小寫。

文件(Document)

Index 裡面單條的記錄稱為 Document(文件)。許多條 Document 構成了一個 Index。

寫點資料進Es

基本概念已經有了,知道查詢是通過倒排索引進行的,所以資料肯定是存放在索引裡面的。

我們現在要寫資料進Es,其實就是把資料寫到Es的索引(index)中,前面已經把Es啟動起來了,並沒有建立索引。

今天寫資料就不寫程式碼了,利用ES的一些封裝很好的介面,直接命令列操作,後期在用程式碼寫資料進Es。

先建立一個index ,使用curl 工具在命令列操作,這是一個put請求。

$curl -X PUT 'localhost:9200/user'

檢視索引是否以及建立成功

$ curl -X GET 'http://localhost:9200/_cat/indices?v'

這個get請求可以檢視當前節點的所有索引

妥妥的已經建立成功

順便說下,刪除一個索引的命令,DELETE引數表示刪除

$curl -X DELETE 'localhost:9200/user'

到這裡索引已經建立好了,可以寫點資料進去了。使用介面 /index/_doc/id ,/索引名/_doc/doc_id

$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/1' -d '
{
  "name": "龍躍十二",
  "title": "工程師",
  "desc": "一個分享網際網路技術和心路歷程的star"
}'

檢視當前索引下的所有資料

$ curl 'localhost:9200/user/_search?pretty=true

到這裡基本我們已經可以寫資料到指定索引了,生產場景不會這麼寫資料的,都是用程式碼寫海量資料進ES的,這就幾條資料也沒什麼搜尋效能可談的。

我之前工作中日誌資料都是TB級別的寫到Es中,當遇到這種資料量的搜尋時才會感受到搜尋引擎的魅力,才會意識到Es的重要性。

這裡主要是練手和跑通流程,所以造了一些資料到Es中

和ES進行互動

其實寫資料進Es已經是一種互動了,在講一些其他的互動介面

目前講的互動方式主要是通過原生的請求的方式,還沒有上升到介面操作,後期在學習的過程中會展現出來。

查詢互動

使用 GET 方法,直接請求/Index/_search,就會返回所有記錄。

$ curl 'localhost:9200/user/_search?pretty=true'
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "龍躍十二",
          "title" : "工程師",
          "desc" : "一個分享網際網路技術和心路歷程的star"
        }
      },
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "三y",
          "title" : "工程師",
          "desc" : "只有光頭才能變得更強"
        }
      },
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "敖丙",
          "title" : "工程師",
          "desc" : "一個網際網路苟且偷生的工具人"
        }
      }
    ]
  }
}

上面程式碼中,返回結果的 took欄位表示該操作的耗時(單位為毫秒),timed_out欄位表示是否超時,hits欄位表示命中的記錄,裡面子欄位的含義如下。

  • total:返回記錄數,本例是2條。
  • max_scor:最高的匹配程度,本例是1.0。
  • hits:返回的記錄組成的陣列。

返回的記錄中,每條記錄都有一個_score欄位,表示匹配的程式,預設是按照這個欄位降序排列。

Es的查詢語法還有很多,後面在結合實戰專案的時候會講解其他語法,你也可以看下官網語法介紹 官網查詢語法。

資料操作互動

新增一條doc記錄的語法示例如下,可以不用指定doc_id的,Es會預設有一個doc_id。

$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
{
  "name": "敖丙",
  "title": "工程師",
  "desc": "一個網際網路苟且偷生的工具人"
}'

刪除一條doc記錄的語法是 /Index/_doc/doc_id

$ curl -X DELETE  'localhost:9200/user/_doc/1'

更新一條記錄的語法示例

$ curl -X PUT -H 'Content-Type: application/json' 'localhost:9200/user/_doc/2' -d '
{
  "name": "三太子敖丙",
  "title": "工程師",
  "desc": "一個網際網路苟且偷生的工具人"
}'

總結一下

本篇文章,我們把Es從官網下載下來,可以run起來,可以寫資料進去,可以查詢,學習了一些簡單的互動語法。

當然Es的魅力不在於此,Es的魅力之一在於可以對海量資料進行高效的檢索。

下篇文章出一個關於Es的寫作大綱,方便大家在看的過程中有一個整理的輪廓。

Es整個知識點我也是邊學邊寫,有什麼不對的地方,還希望大佬們儘管指出來。

龍躍十二