@[toc]
松哥前段時(shí)間連載的 Spring Security 基本上告一段落了,接下來(lái)我會(huì)抽空將這個(gè)系列的教程整理成一個(gè)系列分發(fā)給大家。最近一段時(shí)間自己也稍微休息了一下,不寫教程的日子雖然可以早早睡覺(jué)但是又會(huì)感到無(wú)聊,得找點(diǎn)事情做,感覺(jué)是時(shí)候開(kāi)啟一波新的旅程了~
2018 年國(guó)慶節(jié)期間 ElasticSearch 母公司上市,那個(gè)時(shí)候我就想寫一個(gè) es 教程,可惜后來(lái)爛尾了,這事在我心里老是一個(gè)疙瘩。最近剛好有一個(gè)時(shí)間空檔,就想著能不能把這個(gè)系列給完結(jié)了。
不同于之前的教程,這次的教程我打算出一個(gè)視頻版+圖文混合版的。視頻為主,圖文為輔。視頻我會(huì)上傳到百度網(wǎng)盤,文末會(huì)有文章對(duì)應(yīng)的視頻下載鏈接。
ElasticSearch 目前也算是非?;鹆?,站內(nèi)搜索、日志分析都會(huì)用到它,而且還可以直接當(dāng)成 NoSQL 數(shù)據(jù)庫(kù)來(lái)使用。
接下來(lái),我們就通過(guò)下面這個(gè)簡(jiǎn)單介紹,開(kāi)啟 es 之旅吧~
松哥針對(duì)本文內(nèi)容錄制了一個(gè)視頻,如下:

視頻下載鏈接:https://pan.baidu.com/s/1bIvtBv9OvTEXJUyZRtajgQ 提取碼: pm94
1.Lucene
Lucene 是一個(gè)開(kāi)源、免費(fèi)、高性能、純 Java 編寫的全文檢索引擎,可以算作是開(kāi)源領(lǐng)域最好的全文檢索工具包。
在實(shí)際開(kāi)發(fā)中,Lucene 幾乎適用于任何需要全文檢索的場(chǎng)景,所以 Lucene 先后發(fā)展出好多語(yǔ)言版本,例如 C++、C#、Python 等。
早在 2005 年,Lucene 就升級(jí)為 Apache 頂級(jí)開(kāi)源項(xiàng)目。它的作者是 Doug Cutting,有的人可能沒(méi)聽(tīng)過(guò)這這個(gè)人,不過(guò)你肯定聽(tīng)過(guò)他的另一個(gè)大名鼎鼎的作品 Hadoop。
不過(guò)需要注意的是,Lucene 只是一個(gè)工具包,并非一個(gè)完整的搜索引擎,開(kāi)發(fā)者可以基于 Lucene 來(lái)開(kāi)發(fā)完整的搜索引擎。比較著名的有 Solr、ElasticSearch,不過(guò)在分布式和大數(shù)據(jù)環(huán)境下,ElasticSearch 更勝一籌。
Lucene 主要有如下特點(diǎn):
- 簡(jiǎn)單
- 跨語(yǔ)言
- 強(qiáng)大的搜索引擎
- 索引速度快
- 索引文件兼容不同平臺(tái)
2.ElasticSearch
ElasticSearch 是一個(gè)分布式、可擴(kuò)展、近實(shí)時(shí)性的高性能搜索與數(shù)據(jù)分析引擎。ElasticSearch 基于 Java 編寫,通過(guò)進(jìn)一步封裝 Lucene,將搜索的復(fù)雜性屏蔽起來(lái),開(kāi)發(fā)者只需要一套簡(jiǎn)單的 RESTful API 就可以操作全文檢索。
ElasticSearch 在分布式環(huán)境下表現(xiàn)優(yōu)異,這也是它比較受歡迎的原因之一。它支持 PB 級(jí)別的結(jié)構(gòu)化或非結(jié)構(gòu)化海量數(shù)據(jù)處理
整體上來(lái)說(shuō),ElasticSearch 有三大功能:
- 數(shù)據(jù)搜集
- 數(shù)據(jù)分析
- 數(shù)據(jù)存儲(chǔ)
ElasticSearch 的主要特點(diǎn):
- 分布式文件存儲(chǔ)。
- 實(shí)時(shí)分析的分布式搜索引擎。
- 高可拓展性。
- 可插拔的插件支持。
3.安裝
3.1 單節(jié)點(diǎn)安裝
首先打開(kāi) Es 官網(wǎng),找到 Elasticsearch:
然后點(diǎn)擊下載按鈕,選擇合適的版本直接下載即可。

將下載的文件解壓,解壓后的目錄含義如下:
| 目錄 | 含義 |
|---|---|
| modules | 依賴模塊目錄 |
| lib | 第三方依賴庫(kù) |
| logs | 輸出日志目錄 |
| plugins | 插件目錄 |
| bin | 可執(zhí)行文件目錄 |
| config | 配置文件目錄 |
| data | 數(shù)據(jù)存儲(chǔ)目錄 |
啟動(dòng)方式:
進(jìn)入到 bin 目錄下,直接執(zhí)行 ./elasticsearch 啟動(dòng)即可。

看到 started 表示啟動(dòng)成功。
默認(rèn)監(jiān)聽(tīng)的端口是 9200,所以瀏覽器直接輸入 localhost:9200 可以查看節(jié)點(diǎn)信息。

節(jié)點(diǎn)的名字以及集群(默認(rèn)是 elasticsearch)的名字,我們都可以自定義配置。
打開(kāi) config/elasticsearch.yml 文件,可以配置集群名稱以及節(jié)點(diǎn)名稱。配置方式如下:
cluster.name: javaboy-es
node.name: master
配置完成后,保存配置文件,并重啟 es。重啟成功后,刷新瀏覽器 localhost:9200 頁(yè)面,就可以看到最新信息。

Es 支持矩陣:
3.2 HEAD 插件安裝
Elasticsearch-head 插件,可以通過(guò)可視化的方式查看集群信息。
這里介紹兩種安裝思路。
3.2.1 瀏覽器插件安裝
Chrome 直接在 App Store 搜索 Elasticsearch-head,點(diǎn)擊安裝即可。

公眾號(hào)江南一點(diǎn)雨后臺(tái)回復(fù) Elasticsearch-head,可以下載離線安裝包。
3.2.2 下載插件安裝
四個(gè)步驟
git clone git://github.com/mobz/elasticsearch-head.gitcd elasticsearch-headnpm installnpm run start
啟動(dòng)成功,頁(yè)面如下:

注意,此時(shí)看不到集群數(shù)據(jù)。原因在于這里通過(guò)跨域的方式請(qǐng)求集群數(shù)據(jù)的,默認(rèn)情況下,集群不支持跨域,所以這里就看不到集群數(shù)據(jù)。
解決辦法如下,修改 es 的 config/elasticsearch.yml 配置文件,添加如下內(nèi)容,使之支持跨域:
http.cors.enabled: true
http.cors.allow-origin: "*"
配置完成后,重啟 es,此時(shí) head 上就有數(shù)據(jù)了。

3.3 分布式安裝
假設(shè):
- 一主二從
- master 的端口是 9200,slave 端口分別是 9201 和 9202
首先修改 master 的 config/elasticsearch.yml 配置文件:
node.master: true
network.host: 127.0.0.1
配置完成后,重啟 master。
將 es 的壓縮包解壓兩份,分別命名為 slave01 和 slave02,代表兩個(gè)從機(jī)。
分別對(duì)其進(jìn)行配置。
slave01/config/elasticsearch.yml:
# 集群名稱必須保持一致
cluster.name: javaboy-es
node.name: slave01
network.host: 127.0.0.1
http.port: 9201
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
slave02/config/elasticsearch.yml:
# 集群名稱必須保持一致
cluster.name: javaboy-es
node.name: slave02
network.host: 127.0.0.1
http.port: 9202
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
然后分別啟動(dòng) slave01 和 slave02。啟動(dòng)后,可以在 head 插件上查看集群信息。

3.4 Kibana 安裝
Kibana 是一個(gè) Elastic 公司推出的一個(gè)針對(duì) es 的分析以及數(shù)據(jù)可視化平臺(tái),可以搜索、查看存放在 es 中的數(shù)據(jù)。
安裝步驟如下:
- 下載 Kibana:https://www.elastic.co/cn/downloads/kibana
- 解壓
- 配置 es 的地址信息(可選,如果 es 是默認(rèn)地址以及端口,可以不用配置,具體的配置文件是 config/kibana.yml)
- 執(zhí)行 ./bin/kibana 文件啟動(dòng)
- localhost:5601

Kibana 安裝好之后,首次打開(kāi)時(shí),可以選擇初始化 es 提供的測(cè)試數(shù)據(jù),也可以不使用。
4.ElasticSearch 核心概念介紹
4.1 ElasticSearch 十大核心概念
4.1.1 集群(Cluster)
一個(gè)或者多個(gè)安裝了 es 節(jié)點(diǎn)的服務(wù)器組織在一起,就是集群,這些節(jié)點(diǎn)共同持有數(shù)據(jù),共同提供搜索服務(wù)。
一個(gè)集群有一個(gè)名字,這個(gè)名字是集群的唯一標(biāo)識(shí),該名字成為 cluster name,默認(rèn)的集群名稱是 elasticsearch,具有相同名稱的節(jié)點(diǎn)才會(huì)組成一個(gè)集群。
可以在 config/elasticsearch.yml 文件中配置集群名稱:
cluster.name: javaboy-es
在集群中,節(jié)點(diǎn)的狀態(tài)有三種:綠色、黃色、紅色:
- 綠色:節(jié)點(diǎn)運(yùn)行狀態(tài)為健康狀態(tài)。所有的主分片、副本分片都可以正常工作。
- 黃色:表示節(jié)點(diǎn)的運(yùn)行狀態(tài)為警告狀態(tài),所有的主分片目前都可以直接運(yùn)行,但是至少有一個(gè)副本分片是不能正常工作的。
- 紅色:表示集群無(wú)法正常工作。
4.1.2 節(jié)點(diǎn)(Node)
集群中的一個(gè)服務(wù)器就是一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)中會(huì)存儲(chǔ)數(shù)據(jù),同時(shí)參與集群的索引以及搜索功能。一個(gè)節(jié)點(diǎn)想要加入一個(gè)集群,只需要配置一下集群名稱即可。默認(rèn)情況下,如果我們啟動(dòng)了多個(gè)節(jié)點(diǎn),多個(gè)節(jié)點(diǎn)還能夠互相發(fā)現(xiàn)彼此,那么它們會(huì)自動(dòng)組成一個(gè)集群,這是 es 默認(rèn)提供的,但是這種方式并不可靠,有可能會(huì)發(fā)生腦裂現(xiàn)象。所以在實(shí)際使用中,建議一定手動(dòng)配置一下集群信息。
4.1.3 索引(Index)
索引可以從兩方面來(lái)理解:
名詞
具有相似特征文檔的集合。
動(dòng)詞
索引數(shù)據(jù)以及對(duì)數(shù)據(jù)進(jìn)行索引操作。
4.1.4 類型(Type)
類型是索引上的邏輯分類或者分區(qū)。在 es6 之前,一個(gè)索引中可以有多個(gè)類型,從 es7 開(kāi)始,一個(gè)索引中,只能有一個(gè)類型。在 es6.x 中,依然保持了兼容,依然支持單 index 多個(gè) type 結(jié)構(gòu),但是已經(jīng)不建議這么使用。
4.1.5 文檔(Document)
一個(gè)可以被索引的數(shù)據(jù)單元。例如一個(gè)用戶的文檔、一個(gè)產(chǎn)品的文檔等等。文檔都是 JSON 格式的。
4.1.6 分片(Shards)
索引都是存儲(chǔ)在節(jié)點(diǎn)上的,但是受限于節(jié)點(diǎn)的空間大小以及數(shù)據(jù)處理能力,單個(gè)節(jié)點(diǎn)的處理效果可能不理想,此時(shí)我們可以對(duì)索引進(jìn)行分片。當(dāng)我們創(chuàng)建一個(gè)索引的時(shí)候,就需要指定分片的數(shù)量。每個(gè)分片本身也是一個(gè)功能完善并且獨(dú)立的索引。
默認(rèn)情況下,一個(gè)索引會(huì)自動(dòng)創(chuàng)建 1 個(gè)分片,并且為每一個(gè)分片創(chuàng)建一個(gè)副本。
4.1.7 副本(Replicas)
副本也就是備份,是對(duì)主分片的一個(gè)備份。
4.1.8 Settings
集群中對(duì)索引的定義信息,例如索引的分片數(shù)、副本數(shù)等等。
4.1.9 Mapping
Mapping 保存了定義索引字段的存儲(chǔ)類型、分詞方式、是否存儲(chǔ)等信息。
4.1.10 Analyzer
字段分詞方式的定義。
4.2 ElasticSearch Vs 關(guān)系型數(shù)據(jù)庫(kù)
| 關(guān)系型數(shù)據(jù)庫(kù) | ElasticSearch |
|---|---|
| 數(shù)據(jù)庫(kù) | 索引 |
| 表 | 類型 |
| 行 | 文檔 |
| 列 | 字段 |
| 表結(jié)構(gòu) | 映射(Mapping) |
| SQL | DSL(Domain Specific Language) |
| Select * from xxx | GET http:// |
| update xxx set xx=xxx | PUT http:// |
| Delete xxx | DELETE http:// |
| 索引 | 全文索引 |
這篇文章其實(shí)是松哥所錄制的 Es 視頻教程的筆記,筆記相對(duì)簡(jiǎn)陋一些,小伙伴們也可以參考視頻,視頻下載鏈接:https://pan.baidu.com/s/1bIvtBv9OvTEXJUyZRtajgQ 提取碼: pm94
