ElasticSearch(ES) 起源及原理說明

簡介

Elasticsearch 是一套基於 Apache Lucene (TM) 的開源搜尋引擎,主要透過 Java 開發及使用 Lucene 來建構索引搜尋功能。關於 Lucene 是目前公認性能最好,功能最齊全的搜尋引擎開源庫,由於在這個庫要實現搜尋功能,會非常的複雜,因此在目前有 Elasticsearch 與 Solr..等整合 Lucene技術整合成的搜尋引擎。

在基本特性上, Elasticsearch 讓搜尋變得簡單,並且可以透過 Restful api 進行溝通,以及可實現橫向拓展,支持 PB 等級的數據處理。

在官方的 Elastic cloud (www.elastic.co ) 包含了整合性相當高的生態系,其中就包含 Elasticsearch。

關於 Elasticsearch 的誕生,有幾個關鍵人物:Shay Banon 是 Elasticsearch 的開發者,起初會開發 ES 是因為老婆喜歡做菜,他為了讓老婆可以透過搜尋引擎可以來搜尋食譜,而開發出了 Elasticsearch(雖然至今食譜還沒開發出來),另外 Rod Jhonson 則是 Elasticsearch 早期的投資人,同時也是 Spring 項目的創始人,Doug cutting 則是開發了 Lucene,以及和 Mike Cafarella開發了兩個搜索技術,該項目目前都交由 Apache 管理。

工作原理

當我們搭建一個集群時,這集群會有相當多的索引訊息,

以常用的 google, 百度…搜尋引擎為例,搜尋關鍵字,馬上就可以得到搜尋結果。

這些原理是,當我們送出關鍵字時,會送到搜尋引擎集群,集群內部有多個搜尋引擎節點(ex. ES1, ES2…)。

接著再返回結果,呈現出來。

另外 google, 百度都會有網路爬蟲,持續將網頁內容爬取並且在各節點中建立索引。

維基百科,StackOverflow ,Facebook也都使用 Elasticsearch 來開發搜尋功能,github 則使用 ElasticSearch 來搜索超過 1300億行的程式碼。

正向排序與逆向排序

在搜尋引擎的領域中,正向排序與內向排序是非常重要的概念,主要都是在做分詞 處理的技術。

如,

page1 我是天才,快樂的工程師。

page2 我想下班,忙碌的工程師。

正向索引會得到類似以下結果:

我 是 是我 天才 我是天才 快 樂 快樂 快樂的 工程師....
我 想 想我 下班 我想天才 忙 碌 忙碌 忙碌的 工程師....

逆向索引,則是會把分詞 跟文檔進行映射,會整理出類似以下內容:

關鍵字分詞 文檔
page1, page2
page1
page2
天才 page1
下班 page2
工程師 page1, page2

ES 與 Solr 比較

Solr 也是基於 Lucence 開發的框架所開發的搜尋引擎,基本上與 Elasticsearch 有以下對比:

Solr:

  • 基於 Lucene
  • 安裝上稍微複雜
  • 訪問時需要透過類似 Websocket 方式來溝通,支持 json, xml,csv數據格式
  • 在 solr4.x 才開始支持分布式
  • 建立索引的時間需要比較久(慢查詢)
  • 搜索的性能較好

Elasticsearch

  • 基於 Lucene

  • 安裝簡單

  • 可透過 RESTful 訪問

  • 支持分布式搜尋

  • 建立索引的時間較快,即時性較好

  • 搜索的性能較慢

ES 與 MySQL 比較

MySQL 是 RDB 最常見的資料庫之一。在資料儲存跟 Elasticsearch 的對比如下:

MySQL 關聯資料庫

  • 資料庫(Database)
  • 資料表(Table)
  • 數據行紀錄(Row)
  • 數據列(Column)
  • 模式(Schema)

ElasticSearch

  • 索引(Index)
  • 類型(Type)
  • 文檔(Document)
  • 域(Field)
  • 參數映射(Mapping)