Elasticsearch 基礎介紹
- 2021 年 4 月 4 日
- 筆記
- elasticsearch
Elasticsearch簡介
基礎概念
Elasticsearch由Shay banon在2004年進行初步開發,並且在2010年2月發布第一個版本。
此後Shay banon在2012建立Elasticsearch BV公司,繼續圍繞Elasticsearch提供相關軟體和產品。
Elasticsearch是一個實時的分散式搜索分析引擎,它能讓你以一個前所未有的體驗來探索你的數據。
它常被作用於全文檢索、結構化搜索、數據分析這三個功能的組合。

功能介紹
Elasticsearch基於Apache Lucene的開源搜索引擎,而Lucene無論是在開源亦或是專有領域來說,它可以被認為是迄今為止最先進、性能最好、功能最豐富的的搜索引擎庫。
但是,Lucene僅是一個Java庫,要想使用它你必須熟知Java並將其直接集成到你的應用中,更加糟糕的是Lucene非常複雜,你需要深入了解檢索的相關知識來理解它是如何工作的。
而Elasticsearch將Lucene當做核心,並屏蔽了大部分複雜的操作,通過簡單的RESTful API進行調用,從而讓全文搜索變的簡單。
與SQL的區別
Elasticsearch與MySQL的區別較大,其數據存儲採用JSON格式。
在其中,各個名詞術語也是不相同的,如下表所示:
| Elasticsearch | SQL |
|---|---|
| 索引 | 庫 |
| 類型(7版本後淡化該概念,8版本可能會被移除) | 表 |
| 文檔 | 記錄 |
| filed | 欄位 |
同時,MySQL並不適用於全文檢索,如要查詢某個字元串%,必須使用全表掃描
而Elasticsearch則非常適合全文檢索,並且可以靈活的存儲不同類型的數據
以下是Elasticsearch應用場景:
- 商城的商品搜索
- 所有產品的評論
- 高亮顯示搜索內容
- 收集展示各種日誌
除此之外,相較於MySQL部署分散式的繁瑣,Elasticsearch天生支援分散式,部署簡單,維護輕鬆,也是對運維人員非常友好的一款資料庫產品。
一言以蔽之,Elasticsearch的出現並非為了取代SQL,而是專註於SQL不擅長的領域與其進行互補。
Elasticsearch安裝
安裝方式
Elasticsearch安裝方式有以下4種:
-
docker:
優點:
- 部署方便
- 開箱即用
- 啟動迅速
缺點:
- 需要有docker相關知識
- 修改配置比較麻煩
- 數據存儲需要掛載目錄
-
tar
優點:
- 部署靈活
- 對系統侵佔性小
缺點:
- 需要自己寫啟動管理文件
- 目錄要提前進行規劃
-
rpm | deb:
優點:
- 部署方便
- 啟動腳本安裝即用
- 存放目錄較為標準化
缺點:
- 軟體各個組件分散在不同目錄
- 卸載可能不幹凈
- 默認配置需要修改
-
ansible
優點:
- 及其靈活
- 功能全面
- 批量部署速度快
缺點:
- 需要學習ansible語法和規則
- 需要提前規劃好所有標準
- 需要有專人進行維護
Rpm安裝
在這裡將採用rpm進行安裝,版本為7.6.1,算是目前較新的版本。
1)安裝Java環境,最少要求1.8:
$ yum install -y java-1.8.0-openjdk.x86_64
2)下載安裝軟體,如果速度慢可以在其他瀏覽器上進行下載後通過scp傳輸:
$ cd ~
$ wget //artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-x86_64.rpm
3)進行安裝:
$ rpm -ivh elasticsearch-7.6.1-x86_64.rpm
配置啟動
1)重新載入sys項目:
$ systemctl daemon-reload
2)配置開機啟動:
$ systemctl enable elasticsearch.service
3)啟動Elasticsearch服務(過程較慢,查看日誌,耐心等待):
$ systemctl start elasticsearch.service
4)查看啟動狀態,確保配置文件沒有問題:
$ systemctl status elasticsearch.service
5)由於Elasticsearch啟動較慢,檢查服務進程是否成功啟動:
$ ps -ef | grep elasticsearch
$ netstat -lnpt | grep 9200 # 查看9200埠
如果啟動失敗,請檢查記憶體等是否充裕,或者進行jvm記憶體限制。
目錄介紹
通過以下命令查看Elasticsearch安裝目錄:
$ rpm -ql elasticsearch
通過以下命令查看Elasticsearch配置文件:
$ rpm -qc elasticsearch
重要目錄與文件:
/etc/elasticsearch/elasticsearch.yml # 配置文件
/etc/elasticsearch/jvm.options # jvm虛擬機配置文件
/etc/init.d/elasticsearch # init啟動文件
/etc/sysconfig/elasticsearch # 環境變數配置文件
/usr/lib/sysctl.d/elasticsearch.conf # sysctl變數文件
/usr/lib/systemd/system/elasticsearch.service # systemd啟動文件
/var/lib/elasticsearch # 數據目錄
/var/log/elasticsearch # 日誌目錄
/var/run/elasticsearch # pid目錄
修改配置
Elasticsearch的默認配置已經做得非常好,但是以下一些配置你可以進行選配:
# 查看數據和日誌目錄
$ egrep -v "^#" /etc/elasticsearch/elasticsearch.yml
配置項:
cluster.name: my-application # 集群名稱
node.name: node-1 # 節點名稱
path.data: /data/elasticsearch # 數據目錄
path.logs: /var/log/elasticsearch # 日誌目錄
bootstrap.memory_lock: true # 鎖定記憶體
network.host: localhost # 綁定IP地址
http.port: 9200 # 綁定埠號
discovery.zen.ping.unicast.hosts: [「localhost」] # 集群發現的通訊節點
discovery.zen.minimum_master_nodes: 2 # 最小主節點數
修改記憶體配置,打開注釋:
$ vim /etc/elasticsearch/elasticsearch.yml
# 所在集群名稱與該服務在集群中的名稱
cluster.name: my-application
node.name: node-1
# 服務綁定的地址和埠
network.host: 192.168.0.110
http.port: 9200
# 作為集群主節點啟動
cluster.initial_master_nodes: ["node-1"]
# 是否開啟記憶體限制
action.destructive_requires_name: true
在jvm虛擬機中進行記憶體限定,根據實際情況進行設定,由於我這台centos7的伺服器記憶體較小,因此設定的也比較小,注意這裡最大不能超過32G:
$ vim /etc/elasticsearch/jvm.options
-Xms512m # 最小記憶體
-Xmx512m # 最大記憶體
重啟生效:
$ systemctl restart elasticsearch.service
數據目錄
如果你的數據目錄發生了變更,請確保使用Elasticsearch的管理用戶對目錄進行授權操作:
$ id elasticsearch
uid=996(elasticsearch) gid=992(elasticsearch) 組=992(elasticsearch)
不再進行演示。
相關術語
索引詞
在Elasticsearch中索引詞(term)是一個能夠被索引的精確值。
foo、Foo、FOO幾個單詞是不同的索引詞。
索引詞(term)是可以通過term查詢進行準確的搜索。
文本(text)
文本是一段普通的非結構化文字。
通常,文本會被分拆成一個個的索引詞,存儲在elasticsearch 的索引庫中。
為了讓文本能夠進行搜索,文本欄位需要事先進行分析了;
當對文本中的關鍵詞進行查詢的時候,搜索引擎應該根據搜索條件搜索出原文本。
分析(analysis)
分析是將文本轉換為索引詞的過程,分析的結果依賴於分詞器。
比如:FOO BAR、Foo-Bar和 foo bar這幾個詞有可能會被分析成相同的索引詞foo和bar,這些索引詞存儲在Elasticsearch的索引庫中。
集群(cluster)
集群由一個或多個節點組成,對外提供服務,對外提供索引和搜索功能。
在所有節點,一個集群有一個唯一的名稱默認為「elasticsearch」
此名稱是很重要的,因為每個節點只能是集群的一部分,當該節點被設置為相同的集群名稱時,就會自動加入集群。
當需要有多個集群的時候,要確保每個集群的名稱不能重複,否則節點可能會加入到錯誤的集群。
請注意,一個節點只能加入到一個集群。
此外,你還可以擁有多個獨立的集群,每個集群都有其不同的集群名稱。
節點(node)
一個節點是一個邏輯上獨立的服務,它是集群的一部分,可以存儲數據,並參與集群的索引和搜索功能。
就像集群一樣 ,節點也有唯一的名字,在啟動的時候分配。
如果你不想要默認名稱,你可以定義任何你想要的節點名。
這個名字在數據處理中很重要,在Elasticsearch集群通過節點名稱進行管理和通訊,一個節點可以被配置加入到一個特定的集群。
默認情況下,每個節點會加入名為Elasticsearch 的集群中,這意味著如果你在區域網中部署多個節點,如果網路暢通,他們能彼此發現並自動加入名為Elasticsearch 的一個集群中。
你可以擁有多個你想要的節點。當網路沒有集群運行的時候,只要啟動一個節點,這個節點會默認生成一個新的集群,這個集群也會有自己的一個節點。
分片(shard)
分片是單個Lucene 實例,這是Elasticsearch管理的比較底層的功能。
索引是指向主分片和副本分片的邏輯空間。
對於使用,只需要指定分片的數量,其他不需要做過多的事情。
在開發使用的過程中,我們對應的對象都是索引 ,Elasticsearch 會自動管理集群中所有的分片,當發生故障的時候,Elasticsearch 會把分片移動到不同的節點或者添加新的節點。
一個索引可以存儲很大的數據,這些空間可以超過一個節點的物理存儲的限制。
例如:十億個文檔佔用磁碟空間為 1TB。
僅從單個節點搜索可能會很慢,還有一台物理機器也不一定能存儲這麼多的數據。
為了解決這一問題 ,Elasticsearch將索引分解成多個分片。
當你創建一個索引,你可以簡單地定義你想要的分片數量。
每個分片本身是 一個全功能的、獨立的單元,可以託管在集群中的任何節點。
主分片
每個文檔都存儲在一個分片中,當你存儲一個文檔的時候,系統會首先存儲在主分片中,然後會複製到不同的副本中。
默認情況下,一個索引有5個主分片。
你可以事先制定分片的數量,當分片一旦建立,則分片的數量不能修改。
副本分片
每一個分片有零個或多個副本。
副本主要是主分片的複製,其中有兩個目的:
- 增加高可用性:當主分片失敗的時候,可以從副本分片中選擇一個作為主分片。
- 提高性能:當查詢的時候可以到主分片或者副本分片中進行查詢。
默認情況下,一個主分片配有一個副本,但副本的數量可以在後面動態地配置增加。
副本分片必部署在不同的節點上,不能部署在和主分片相同的節點上。
索引(index)
索引是具有相同結構的文檔集合。
例如:可以有一個客戶資訊的索引,包括一個產品目錄的索引,一個訂單數據的索引 。
在系統上索引的名字全部小寫,通過這個名字可以用來執行索引、搜索、更新和刪除操作等。
在單個集群中,可以定義多個你想要的索引。
類型(type)
在索引中,可以定義一個或多個類型,類型是索引的邏輯分區。
在一般情況下,一種類型被定義為具有一組公共欄位的文檔。
例如,讓我們假設你運行一個部落格平台,並把所有的數據存儲在一個索引中。
在這個索引中,你可以定義一種類型為用戶數據,一種類型為部落格數據,另一種類型為評論數據。
文檔(doc)
文檔是存儲在Elasticsearch中的一個JSON格式的字元串。
它就像在關係資料庫中表的一行。
每個存儲在索引中的 一個文檔都有一個類型和一個ID,每個文檔都是一個JSON對象,存儲了零個或者多個欄位,或者鍵值對。
原始的 JSON 文檔假存儲在一個叫作Sour的欄位中。
當搜索文檔的時候默認返回的就是這個欄位。
映射
映射像關係資料庫中的表結構。
每一個索引都有一個映射,它定義了索引中的每一個欄位類型,以及一個索引範圍內的設置。
一個映射可以事先被定義,或者在第一次存儲文檔的時候自動識別。
欄位
文檔中包含零個或者多個欄位,欄位可以是一個簡單的值(例如字元串、整數、日期),也可以是一 個數組或對象的嵌套結構。
欄位類似於關係資料庫中表的列。
每個欄位都對應一個欄位類型,例如整數、字元串、對象等。
欄位還可以指定如何分析該欄位的值。
主鍵
ID是一個文件的唯一標識。
如果在存庫的時候沒有提供ID,系統會自動生成一個ID。
文檔的 index與type的ID必須是唯一的。
複製
複製是一個非常有用的功能,不然會有單點問題。
當網路中的某個節點出現問題的時候,複製可以對故障進行轉移,保證系統的高可用。
因此,Elasticsearch允許你創建一個或多個拷貝,你的索引分片就形成了所謂的副本或副本分片。
複製是重要的,主要的原因有:
- 它提供丁高可用性,當節點失敗的時候不受影響。需要注意的是,一個複製的分片不會存儲在同一個節點中。
- 它允許你擴展搜索量,提高並發量,因為搜索可以在所有副本上並行執行。 每個索引可以拆分成多個分片。
索引可以複製零個或者多個分片,一旦複製,每個索引就有了主分片和副本分片。
分片的數量和副本的數量可以在創建索引時定義,當創建索引後,你可以隨時改變副本的數量,但你不能改變分片的數量。
默認情況下,每個索引分配5個分片和一個副本,這意味著你的集群節點至少要有兩個節點,你將擁有5個主要的分片和5個副本分片共計10個分片。
每個Elasticsearch分片是一個Lucene 的索引。
有文檔存儲數量限制,你可以在一個單一的Lucene索引中存儲的最大值為lucene-5843,極限是2147483519(=integer.max_value-128)個文檔。
你可以使用cat/shards API監控分片的大小。
倒排索引
Elasticsearch基於Lucene,而Lucene能夠做到全文檢索的功能就依賴於倒排索引。
document被成功index錄入後,Elasticsearch會對index創建一張倒排索引表。
如下所示,這裡有2個文檔,都在一個index中:
DOCUMENT1 : "Hello,Elasticsearch"
DOCUMENT2 : "Hello,World And Elasticsearch"
這個index的倒排索引表如下,它會將上述document的辭彙進行拆分並記錄:
| term(精確查找) | document01 | document02 |
|---|---|---|
| Hello | √ | √ |
| World | × | × |
| Hi | × | × |
| Elasticsearch | √ | √ |
| And | × | √ |
在進行查詢時,會通過關鍵詞命中獲得分數,分數越高查詢的條件排名越靠前。
如,我查詢的辭彙是 「Hello World」,結果如下:
DOCUMENT2 : Hello 存在 World 存在 得分 2
DOCUMENT1 : Hello 存在 World 不存在 得分 1

