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

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

Apache Lucene簡介

Lucene基本概念

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

  • 文檔:索引和搜索到主要數據載體,它包含一個或多個字段,存放將要寫入索引或從索引搜索出來的數據

  • 字段:文檔的一個片段,是一個K-V結構

  • 詞項:搜索時的一個單位,代表文本中的某個詞

  • 詞條:詞項在字段中的一次出現,包括詞項的文本、開始和結束的位移以及類型

  • 倒排索引:倒排索引可以快速獲取包含某個單詞的文檔。倒排索引由兩部分組成:單詞詞典和倒排文件

  • 單詞詞典:單詞詞典是由文檔集合中出現過的所有單詞構成的字符串集合,單詞詞典內每條索引項記載單詞本身的一些信息以及指向「倒排列表」的指針

  • 倒排列表:倒排列表記載了出現過某個單詞的所有文檔的列表以及該單詞在文檔中的位置,每條記錄稱爲一個倒排項(Posting)

  • 倒排文件:所有單詞的倒排列表往往順序存在磁盤的某個文件,這個文件稱爲倒排文件

640?wx_fmt=png

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

假設這裏有三句話:

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, 1, 2}

"what" : {0,1}

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

"a" : {(2, 2)}

"banana" : {(2, 3)}

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

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

"what" : {(0, 2), (1, 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的啓動過程,後面還會有更加深入的討論。

敬請期待。

640?wx_fmt=gif

掃碼關注

有趣的靈魂在等你

640?wx_fmt=jpeg
640?wx_fmt=gif
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章