Elasticsearch 基礎介紹

雲崖先生發表於2021-04-04

Elasticsearch簡介

基礎概念

​ Elasticsearch由Shay banon在2004年進行初步開發,並且在2010年2月釋出第一個版本。

​ 此後Shay banon在2012建立Elasticsearch BV公司,繼續圍繞Elasticsearch提供相關軟體和產品。

​ Elasticsearch是一個實時的分散式搜尋分析引擎,它能讓你以一個前所未有的體驗來探索你的資料。

​ 它常被作用於全文檢索、結構化搜尋、資料分析這三個功能的組合。

image-20210403211058710

功能介紹

​ 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種:

  1. docker:

    優點:

    • 部署方便
    • 開箱即用
    • 啟動迅速

    缺點:

    • 需要有docker相關知識
    • 修改配置比較麻煩
    • 資料儲存需要掛載目錄
  2. tar

    優點:

    • 部署靈活
    • 對系統侵佔性小

    缺點:

    • 需要自己寫啟動管理檔案
    • 目錄要提前進行規劃
  3. rpm | deb:

    優點:

    • 部署方便
    • 啟動指令碼安裝即用
    • 存放目錄較為標準化

    缺點:

    • 軟體各個元件分散在不同目錄
    • 解除安裝可能不乾淨
    • 預設配置需要修改
  4. 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 https://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

相關文章