少點程式碼,多點頭髮
本文已經收錄至我的GitHub,歡迎大家踴躍star 和 issues。
https://github.com/midou-tech/articles
看文章有兩點需要注意:
本公號講解的Elasticsearch是基於7.7.0版本,你們在閱讀一些相關書籍和部落格注意版本,不同版本很多概念會有出入。
文章寫作過程中會經常將Elasticsearch簡寫為Es,閱讀過程中需要注意。
一般學習一個新的技術或者產品,第一步就是用起來。什麼設計理論,框架原始碼,都別和我談,先run起來。這也是在公司看別人專案的絕招。
用起來,有一個很明顯的點,是你能感受到他,不然天天看理論知識,看原始碼會讓你覺得你好像懂了,但又心裡沒底,最終會導致你走火入魔。
今天龍叔的主題就是 學Es,先run起來,用起來之後在去探索內部更多問題和原理。
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整個知識點我也是邊學邊寫,有什麼不對的地方,還希望大佬們儘管指出來。