《Elasticsearch技術(shù)解析與實戰(zhàn)》Chapter 1.1:Elasticsearch入門和倒排索引

1. 簡介

Elasticsearch是一個機遇Lucene構(gòu)建的開源、分布式、RESTful接口全文搜索引擎。同時,Elasticsearch還是一個分布式文檔數(shù)據(jù)庫,能夠擴展至數(shù)百個服務(wù)器存儲以處理PB級數(shù)據(jù),通常作為復(fù)雜搜索場景的首選利器。

Elasticsearch的優(yōu)點:

  1. 橫向可擴展性:只需要增加一臺服務(wù)器,配置完畢即可加入集群。
  2. 分片機制提供更好的分布性:同一個索引分成多個分片,類似于HDFS的塊機制,分而治之的方式提升處理效率。
  3. 高可用:提供復(fù)制機制,一個分片可以設(shè)置多個副本,在某臺服務(wù)器宕機情況下,集群依舊可以工作,并在宕機服務(wù)器重啟后恢復(fù)數(shù)據(jù)。
  4. 使用簡單:開箱即用,快速搭建搜索服務(wù)。

Elasticsearch wiki:https://zh.wikipedia.org/wiki/Elasticsearch

2. 數(shù)據(jù)庫搜索

在數(shù)據(jù)量少的情況下可以當(dāng)做搜索服務(wù)來使用,然而數(shù)據(jù)庫歸根結(jié)底是做持久化存儲。如果數(shù)據(jù)量大就需要做搜索服務(wù),底層數(shù)據(jù)還是關(guān)系數(shù)據(jù)庫。我司老系統(tǒng)中有一個訂單表,數(shù)據(jù)量已經(jīng)高達兩億,客服等后臺系統(tǒng)通常帶有范圍或批量條件等查詢,這時數(shù)據(jù)庫基本上就無法響應(yīng)了,報警根本停不下來。因此,用數(shù)據(jù)庫來實現(xiàn)搜索,性能差,可用性不高。

3. Lucene

Lucene是一個開源的全文搜索引擎工具包,其目的是為開發(fā)者提供一個簡單工具包,以快速實現(xiàn)全文檢索的功能。

Lucene wiki:https://zh.wikipedia.org/wiki/Lucene

4. 倒排索引

倒排索引中的索引對象是文檔或者文檔集合中的單詞等,用來存儲這些單詞在一個文檔或者一組文檔中的存儲位置,是對文檔或者文檔集合的一種最常用的索引機制。搜索引擎的關(guān)鍵步驟就是建立倒排索引,下面介紹Lucene是如何建立倒排索引和相應(yīng)的生成算法。

假設(shè)有兩篇文章:
文章1:Tom lives in Guangzhou, I live in Guangzhou too.
文章2:He once lived in Shanghai.

4.1 取得關(guān)鍵詞

Lucene是基于關(guān)鍵詞索引和查詢的,首先要進行關(guān)鍵詞提?。?/p>

  • 分詞:英文單詞由空格分隔,較好處理;中文詞語由于是連在一起的,需要進行特殊的分詞處理(后面會介紹分詞器相關(guān)知識)。

  • 過濾無概念詞語:英文中“in”“once”“too”等詞沒有實際意義;中文中“的”“是”等也無實際意義,這些無概念詞語可以過濾掉。

  • 統(tǒng)一大小寫:“he”和“HE”表示的含義一樣,所以單詞需要統(tǒng)一大小寫。

  • 語義還原:通常用戶查詢“l(fā)ive”時希望能將“l(fā)ives”和“l(fā)ived”也查詢出來,所以需要將“l(fā)ives”和“l(fā)ived”還原成“l(fā)ive”。

  • 過濾標(biāo)點符號

    經(jīng)過以上過濾,得到如下結(jié)果:
    文章1關(guān)鍵詞:tom live guangzhou i live guangzhou
    文章2關(guān)鍵詞:he live shanghai

4.2 建立倒排索引

關(guān)鍵詞建立完成后,就可以進行倒排索引建立了。過濾后的關(guān)系是:“文章號“對”文章中所有關(guān)鍵詞“,倒排索引把這個關(guān)系倒過來變成:”關(guān)鍵詞“對”擁有關(guān)鍵詞的所有文章號“。

通常僅知道關(guān)鍵詞在哪些文章中出現(xiàn)還不夠,還需要知道關(guān)鍵詞在文章中出現(xiàn)的次數(shù)和位置,通常有兩種位置:

  1. 字符位置,即記錄該詞是文章中第幾個字符(優(yōu)點是顯示并定位關(guān)鍵詞快)。
  2. 關(guān)鍵詞位置,即記錄該詞是文章中的第幾個關(guān)鍵詞(優(yōu)點是節(jié)約索引空間、詞組查詢快),Lucene中記錄的就是這種位置。

以上就是Lucene索引結(jié)構(gòu)中最核心的部分,關(guān)鍵字是按字符順序排列的(Lucene沒有使用B樹結(jié)構(gòu)),因此Lucene可以使用二元搜索算法快速定位關(guān)鍵詞。

4.3 實現(xiàn)

Lucene將上面三列分別作為詞典文件(Term Dictionary)、頻率文件(frequencies)、位置文件(positions)保存。其中詞典文件不僅保存了每個關(guān)鍵詞,還保留了指向頻率文件和位置文件的指針,通過指針可以找到該關(guān)鍵字的頻率信息和位置信息。

Lucene中使用了field的概念,用于表達信息所在的位置(如標(biāo)題中、文章中、url中),在建索引中,該field信息也記錄在詞典文件中,每個關(guān)鍵詞都有一個field信息,因為每個關(guān)鍵字一定屬于一個或多個field。

4.4 壓縮算法

為了減小索引文件的大小,Lucene對索引還是用了壓縮技術(shù)。
首先,對詞典文件中的關(guān)鍵詞進行壓縮,關(guān)鍵詞壓縮為<前綴長度,后綴>,例如:當(dāng)前詞為”阿拉伯語“,上一個詞為”阿拉伯“,那么”阿拉伯語“壓縮為<3,語>。
其次大量用到的是對數(shù)字的壓縮,數(shù)字只保存與上一個值的差值(這樣可以減少數(shù)字的長度,進而減少保存該數(shù)字需要的字節(jié)數(shù))。例如當(dāng)前文章號是16389(不壓縮要用3個字節(jié)),上一文章號是16382,壓縮后保存7(只用一個字節(jié))。

壓縮算法推薦閱讀:https://www.cnblogs.com/dreamroute/p/8484457.html

4.5 實戰(zhàn)

查詢單詞”live“,Lucene先對詞典二元查找,找到該詞,通過指向頻率文件的指針讀出所有文章號,然后返回結(jié)果。詞典通常非常小,可以達到毫秒級返回。而用普通的順序匹配算法,不建立索引,而是對所有文章的內(nèi)容進行字符串匹配,過程是很緩慢的,當(dāng)數(shù)據(jù)量很大時,耗時更加嚴(yán)重。

5. 基礎(chǔ)概念

5.1 索引詞(term)

Elasticsearch中能夠被索引的精確值。foo、Foo、FOO幾個單詞是不同的索引詞。索引詞可以通過term查詢進行準(zhǔn)確的搜索。

5.2 文本(text)

文本會被拆分成一個個索引詞存儲在索引庫中,為后續(xù)搜索提供支持。

5.3 分析(analysis)

分析是將文本轉(zhuǎn)換為索引詞的過程,其結(jié)果依賴于分詞器。

5.4 集群(cluster)

集群由一個或多個節(jié)點組成,對外提供服務(wù)。Elasticsearch節(jié)點如果有相同的集群名稱會自動加入到同一個集群,因此如果你擁有多個獨立集群,每個集群都要設(shè)置不同的名稱。

5.5 節(jié)點(node)

節(jié)點是一個邏輯上獨立的服務(wù),是集群的一部分,可以存儲數(shù)據(jù),并參與集群的索引和搜索功能。

5.6 路由(routing)

文檔存儲時是通過散列值進行計算,最終選擇存儲在主分片中,這個值默認(rèn)是由文檔的ID生成。

5.7 分片(shard)

分片是單個Lucene實例,是Elasticsearch管理的比較底層的功能。當(dāng)索引占用空間很大超過一個節(jié)點的物理存儲,Elasticsearch將索引切分成多個分片,分散在不同的物理節(jié)點上,以解決單物理節(jié)點存儲空間有限的問題。

5.8 主分片(primary shard)

每個文檔都存儲在一個分片中,存儲文檔時系統(tǒng)會首先存儲在主分片中,然后復(fù)制到不同的副本中。默認(rèn)情況下一個索引擁有5個主分片,分片一旦建立,主分片數(shù)量就無法修改。

5.9 副本分片(replica shard)

每個主分片有零個或多個副本,是主分片的復(fù)制,其主要目的是:

  1. 增加高可用性:當(dāng)主分片失敗時,某一副本分片提升為主分片
  2. 提高性能:副本分片數(shù)量可以動態(tài)配置,可以為主分片分擔(dān)查詢壓力。
  3. 允許水平分割擴展數(shù)據(jù)
  4. 允許分配和并行操作,從而提高性能和吞吐量。

5.10 復(fù)制(replica)

主分片的數(shù)據(jù)會復(fù)制到副本分片中,這樣避免了單點問題,當(dāng)某個節(jié)點發(fā)生故障,復(fù)制可以對故障進行轉(zhuǎn)移,保證系統(tǒng)的高可用。

5.11 索引(index)

索引是具有相同結(jié)構(gòu)的文檔合集。

5.12 類型(type)

一個索引可以定義一個或多個類型,類型是索引的邏輯分區(qū)。

5.13 文檔(document)

文檔是存儲在Elasticsearch中的一個JSON格式的字符串,就像關(guān)系數(shù)據(jù)庫中表的一行記錄。

5.14 映射(mapping)

映射像關(guān)系數(shù)據(jù)庫中的表結(jié)構(gòu),每個索引都有一個映射,它定義了索引中的每一個字段類型。映射可以事先被定義,也可以在第一次存儲文檔時被自動識別。

5.15 字段(field)

文檔中包含零個或多個字段,字段可以是一個簡單的值,也可以是一個數(shù)組或?qū)ο蟮那短捉Y(jié)構(gòu)。字段類似于關(guān)系數(shù)據(jù)庫中表的列,每個字段都對應(yīng)一個字段類型。

5.16 來源字段(source field)

默認(rèn)情況下源文檔將被存儲在_source字段中,查詢時返回該字段。

5.17 主鍵(ID)

ID是文件的唯一標(biāo)識,如果未指定,系統(tǒng)會自動生成一個ID,文檔的index/type/id必須是唯一的。

5.18 Elasticsearch核心概念 vs. 數(shù)據(jù)庫核心概念

Elasticsearch 數(shù)據(jù)庫
Document row 行
Type table 表
Index database 庫

Tips

本文同步發(fā)表在公眾號,歡迎大家關(guān)注!??
后續(xù)筆記歡迎關(guān)注獲取第一時間更新!


公眾號二維碼.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容