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

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

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

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

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

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

公眾號江南一點雨后臺回復(fù) Elasticsearch-head,可以下載離線安裝包。
3.2.2 下載插件安裝
四個步驟
git clone git://github.com/mobz/elasticsearch-head.gitcd elasticsearch-headnpm installnpm run start
啟動成功,頁面如下:

注意,此時看不到集群數(shù)據(jù)。原因在于這里通過跨域的方式請求集群數(shù)據(jù)的,默認情況下,集群不支持跨域,所以這里就看不到集群數(shù)據(jù)。
解決辦法如下,修改 es 的 config/elasticsearch.yml 配置文件,添加如下內(nèi)容,使之支持跨域:
http.cors.enabled: true
http.cors.allow-origin: "*"
配置完成后,重啟 es,此時 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,代表兩個從機。
分別對其進行配置。
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"]
然后分別啟動 slave01 和 slave02。啟動后,可以在 head 插件上查看集群信息。

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

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