Elasticsearch中的一些概念整理:文檔、類型、索引、倒排索引

Elasticsearch中的一些概念整理

1. ES是什麼?能幹什麼?

Elasticsearch是一個實時分佈式搜索和分析引擎。它讓你以前所未有的速度處理大數據成爲可能。

2. 一些名詞解釋

  • 文檔:

Elasticsearch是面向文檔(document oriented)的,這意味着它可以存儲整個對象或文檔(document)。然而它不僅僅是存儲,還會索引(index,注意這裏是動詞的意思)每個文檔的內容使之可以被搜索。在Elasticsearch中,你可以對文檔(而非成行成列的數據)進行索引、搜索、排序、過濾。這種理解數據的方式與以往完全不同,這也是Elasticsearch能夠執行復雜的全文搜索的原因之一。

  • 索引:

在Elasticsearch中存儲數據的行爲就叫做索引(indexing, 動詞),不過在索引之前,我們需要明確數據應該存儲在哪裏,同樣,存儲在索引(indices, 名詞)中。

「索引」含義的區分

你可能已經注意到索引(index)這個詞在Elasticsearch中有着不同的含義,所以有必要在此做一下區分:

  • 索引(名詞) 如上文所述,一個索引(index)就像是傳統關係數據庫中的數據庫,它是相關文檔存儲的地方,index的複數是indices 或indexes。
  • 索引(動詞) 「索引一個文檔」表示把一個文檔存儲到索引(名詞)裏,以便它可以被檢索或者查詢。這很像SQL中的INSERT關鍵字,差別是,如果文檔已經存在,新的文檔將覆蓋舊的文檔。
  • 倒排索引 傳統數據庫爲特定列增加一個索引,例如B-Tree索引來加速檢索。Elasticsearch和Lucene使用一種叫做倒排索引(inverted index)的數據結構來達到相同目的。
  • 類型

文檔歸屬於一種類型(type),而這些類型存在於索引(index)中,我們可以畫一些簡單的對比圖來類比傳統關係型數據庫:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

Elasticsearch集羣可以包含多個索引(indices)(數據庫),每一個索引可以包含多個類型(types)(表),每一個類型包含多個文檔(documents)(行),然後每個文檔包含多個字段(Fields)(列)。

  • 分析

分析(analysis)是這樣一個過程:
首先, 標記化一個文本塊爲適用於倒排索引單獨的詞(term)
然後標準化這些詞爲標準形式, 提高它們的“可搜索性”或“查全率”

要快速檢索的字段,分析以後,生成倒排索引。檢索的時候,輸入的字符串也會經過同樣規則的分析,這樣可以提高“可搜索性”

3. 倒排索引

Elasticsearch使用一種叫做倒排索引(inverted index)的結構來做快速的全文搜索。 倒排索引由在文檔中出現的唯一的單詞列表, 以及對於每個單詞在文檔中的位置組成。

例如, 我們有兩個文檔, 每個文檔 content 字段包含:

1. The quick brown fox jumped over the lazy dog
2. Quick brown foxes leap over lazy dogs in summer

爲了創建倒排索引, 我們首先切分每個文檔的 content 字段爲單獨的單詞( 我們把它們叫做詞(terms)或者表徵(tokens)), 把所有的唯一詞放入列表並排序, 結果是這個樣子的:(我的理解是按照ascII碼順序排序的,先大寫字母再小寫,從A-z, a-z)
在這裏插入圖片描述
現在, 如果我們想搜索 “quick brown” , 我們只需要找到每個詞在哪個文檔中出現即可:
在這裏插入圖片描述
兩個文檔都匹配, 但是第一個比第二個有更多的匹配項。 如果我們加入簡單的相似度算法(similarity algorithm), 計算匹配單詞的數目, 這樣我們就可以說第一個文檔比第二個匹配度更高——對於我們的查詢具有更多相關性。但是在我們的倒排索引中還有些問題:

  1. “Quick” 和 “quick” 被認爲是不同的單詞, 但是用戶可能認爲它們是相同的。
  2. “fox” 和 “foxes” 很相似, 就像 “dog” 和 “dogs” ——它們都是同根詞。
  3. “jumped” 和 “leap” 不是同根詞, 但意思相似——它們是同義詞。

上面的索引中, 搜索 “+Quick +fox” 不會匹配任何文檔( 記住, 前綴 + 表示單詞必須匹配到) 。 只有 “Quick” 和 “fox” 都在同一文檔中才可以匹配查詢, 但是第一個文檔包含 “quick fox” 且第二個文檔包含 “Quick foxes” .( 說白了就是單複數和同義詞沒法匹配)用戶可以合理地希望兩個文檔都能匹配查詢, 我們也可以做得更好。
如果我們將詞爲統一爲標準格式, 這樣就可以找到不是確切匹配查詢, 但是足以相似從而可以關聯的文檔。 例如:

  1. “Quick” 可以轉爲小寫成爲 “quick” 。
  2. “foxes” 可以被轉爲根形式 “fox” 。 同理 “dogs” 可以被轉爲 “dog” 。
  3. “jumped” 和 “leap” 同義就可以只索引爲單個詞 “jump”

現在的索引:
在這裏插入圖片描述
但我們還未成功。 我們的搜索 “+Quick +fox” 依舊失敗, 因爲 “Quick” 的確切值已經不在索引裏, 不過, 如果我們使用相同的標準化規則處理查詢字符串的 content 字段, 查詢將變成 “+quick +fox” , 這樣就可以匹配到兩個文檔。

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