1. 程式人生 > 程式設計 >Elasticsearch從入門到放棄:人生若只如初見

Elasticsearch從入門到放棄:人生若只如初見

Elasticsearch系列開坑啦,入門總是愉快的,學一學再放棄啊。

Apache Lucene簡介

Lucene基本概念

Apache Lucene是ElasticSearch使用的全文檢索庫。瞭解Lucene之前,需要先了解一些概念:

  • 檔案:索引和搜尋到主要資料載體,它包含一個或多個欄位,存放將要寫入索引或從索引搜尋出來的資料
  • 欄位:檔案的一個片段,是一個K-V結構
  • 詞項:搜尋時的一個單位,代表文字中的某個詞
  • 詞條:詞項在欄位中的一次出現,包括詞項的文字、開始和結束的位移以及型別
  • 倒排索引:倒排索引可以快速獲取包含某個單詞的檔案。倒排索引由兩部分組成:單詞詞典和倒排檔案
  • 單詞詞典:單詞詞典是由檔案集合中出現過的所有單詞構成的字串集合,單詞詞典內每條索引項記載單詞本身的一些資訊以及指向「倒排列表」的指標
  • 倒排列表:倒排列表記載了出現過某個單詞的所有檔案的列表以及該單詞在檔案中的位置,每條記錄稱為一個倒排項(Posting)
  • 倒排檔案:所有單詞的倒排列表往往順序存在磁碟的某個檔案,這個檔案稱為倒排檔案

inverted index

其中最重要的是倒排索引,為了方便理解,我們看一個簡單的例子。

假設這裡有三句話:

T[0] = "it is what it is"

T[1] = "what is it"

T[2] = "it is a banana"

倒排索引通常有兩種表現形式:

  • inverted file index{詞項,詞項所在檔案ID}

"a" : {2}

"banana" : {2}

"is" : {0,1,2}

"it" : {0,2}

"what" : {0,1}

  • full inverted index{詞項,(詞項所在檔案ID,在具體檔案中的位置)}

"a" : {(2,2)}

"banana" : {(2,3)}

"is" : {(0,1),(0,4),(1,(2,1)}

"it" : {(0,0),3),2),0)}

"what" : {(0,0)}

Lucene查詢語言

在瞭解了Lucene的一些基本概念之後,還需要了解Lucene的查詢語言。一個查詢通常被分割為詞項和操作符,詞項可以是單個詞或短語。操作符包括:

  • AND:檔案同時包含AND兩邊的詞項時才返回
  • OR:檔案包含OR兩邊的詞項中任意一個時就返回
  • NOT:不包含NOT操作符後面的詞項
  • +:只有包含+操作符後面詞項的檔案才會返回。例如,查詢+lucene apache表示必須包含lucene,apache可包含可不包含
  • -:匹配的檔案不能出現-操作符後的詞項
  • 冒號:查詢title:elasticsearch表示要查詢所有在title欄位中包含詞項elastisearch的檔案
  • 萬用字元(?/*):?匹配任意一個字元,*匹配任意多個字元(出於效能考慮,萬用字元不能作為詞項的第一個字元)
  • ~:用於Lucene中的模糊查詢,~後面跟的整數值確定了近似詞項與原始詞項的最大編輯距離。例如查詢boy~2,那麼boy和boys這兩個詞項都能匹配,用於短語時,則表示詞項之間可以接受的最大距離
  • ^:用於對詞項進行加權
  • 花括號:表示範圍查詢

對於一些特殊字元的查詢,我們通常使用反斜槓進行轉義。

Elasticsearch基本概念

瞭解了Lucene的基本概念以後,我們回到正題,再來看一下Elasticsearch的一些基本概念,可能和Lucene有一些重複,不過還是有一些Elasticsearch特有的屬性。

  • **索引(index):**資料儲存在索引中,可以向索引寫入檔案或者從索引讀取檔案,Elasticsearch的索引可能由一個或多個Lucene索引構成。
  • **檔案(document):**檔案由欄位構成,每個欄位有它的欄位名以及一個或多個欄位值
  • **對映(mapping):**用於儲存元資訊,這些元資訊決定了如何將輸入文字分割為詞條,哪些詞條應該被過濾掉等
  • **型別(type):**每個檔案都有與之對應的型別,同一型別下的檔案資料結構通常保持一致,不同檔案可以有不同的對映。但是在Elasticsearch7以後已經刪除了這個概念
  • **節點(node):**叢集中每個ES例項都稱作一個節點
  • **叢集(cluster):**在生產環境中,我們的資料量和查詢壓力可能超過了單機負載,因此需要多個節點協同處理
  • **分片(shard):**ES會將資料散落到多個Lucene索引上。這些Lucene索引稱為分片。ES會自動進行分片處理
  • **副本(replica):**ES會為每個分片建立冗餘的副本,一方面分攤請求壓力,另一方面是為了保證資料不會丟失。ES支援在任意時間點新增或移除副本

Elasticsearch的啟動過程

當Elasticsearch啟動時,它使用廣播技術來發現同一叢集內的其他節點,叢集中會有一個節點被選為master節點。master節點負責管理叢集狀態,並在叢集中節點數量變化時做出反應。但從使用者角度來看,master節點與其他節點沒有什麼區別,命令可以傳送的任意節點執行。

master節點會檢查所有分片,決定哪些分片為主分片。主分片確定以後,叢集狀態為黃色,此時可以接收查詢。然後master節點會決定是否要對各個分片建立副本,副本也沒有問題以後,叢集狀態變為綠色。

Elasticsearch的叢集狀態分為3種:

  • 綠色:一切完好
  • 黃色:所有資料都可用,但有些分片沒有分配副本
  • 紅色:有些資料不可用

關於Elasticsearch的啟動過程,後面還會有更加深入的討論。

敬請期待。