ElasticSearch (ES)學習之路(一)ES 概念

ElasticSearch (ES)學習之路(一)

最近在自主學習全文檢索技術中…

爲什麼咱們的數據庫有了查詢查詢功能還要額外使用其餘的搜索技術?

爲什麼要用搜索引擎?我們的所有數據在數據庫裏面都有,而且 Oracle、Mysql等數據庫裏也能提供查詢檢索或者聚類分析功能,直接通過數據庫查詢不就可以了嗎?確實,我們大部分的查詢功能都可以通過數據庫查詢獲得,如果查詢效率低下,還可以通過建數據庫索引,優化SQL等方式進行提升效率,甚至通過引入緩存來加快數據的返回速度。如果數據量更大,就可以分庫分表來分擔查詢壓力。

那爲什麼還要全文搜索引擎呢?我們主要從以下幾個原因分析:

  • 數據類型
    全文索引搜索支持非結構化數據(無固定長度或者格式 例如 xml數據 圖片數據等)的搜索,可以更好地快速搜索大量存在的任何單詞或單詞組的非結構化文本。
    例如 Google,百度類的網站搜索再或者說我們常用的 j京東 淘寶 輸入搜索信息後,出現相關信息,並關鍵字高亮顯示,它們都是根據網頁中的關鍵字生成索引,我們在搜索的時候輸入關鍵字,它們會將該關鍵字即索引匹配到的所有網頁返回;還有常見的項目中應用日誌的搜索等等。對於這些非結構化的數據文本,關係型數據庫搜索不是能很好的支持。
  • 索引的維護複雜而繁瑣
    一般傳統數據庫,全文檢索都實現的很雞肋,很少人在數據庫存文本類型字段(Text Longtext等)。進行全文檢索需要掃描整個表,如果數據量大的話即使對SQL的語法優化,也收效甚微。建立了索引,但是維護起來也很麻煩,對於 insert 和 update 操作都會重新構建索引。

那麼我們在什麼時候使用全文搜索引擎合適呢?

  1. 搜索的數據對象是大量的非結構化的文本數據。
  2. 文件記錄量達到數十萬或數百萬個甚至更多。
  3. 支持大量基於交互式文本的查詢。
  4. 需求非常靈活的全文搜索查詢。
  5. 對高度相關的搜索結果的有特殊需求,但是沒有可用的關係數據庫可以滿足。
  6. 對不同記錄類型、非文本數據操作或安全事務處理的需求相對較少的情況。

那麼什麼叫全文檢索呢?

我們生活中的數據分爲結構化數據非結構化數據
結構化數據:具有固定格式或有限長度的數據,可以用二維表結構來邏輯表達實現的,如數據庫,元數據等。
非結構化數據:指不定長或無固定格式的數據,如辦公文檔、文本、圖片、XML、HTML、各類報表、圖像和音頻/視頻信息等等。也叫全文數據。

對於結構化數據的搜索:如對數據庫的搜索,用 SQL 語句。再如對元數據的搜索,如利用windows 搜索對文件名,類型,修改時間進行搜索等。
對非結構化數據的搜索:如利用 windows 的搜索也可以搜索文件內容,Linux 下的 grep命令,再如用 Google 和百度可以搜索大量內容數據。

對非結構化數據也即對全文數據的搜索主要有兩種方法:
一種是順序掃描法:比如在一個項目中接口 會返回某一個視圖(html頁面),其會在項目中一個文件一個文件的找,對於每個文檔從頭到尾的去找,直到掃描項目裏面的所有文件。

window 的搜索文件內容,linux 的 grep 命令就是如此的。小數據量的文件還可以接受,如果對於大量的文件,方法就很慢了。
另一種方法就是通過索引:把非結構化數據重新設計成有一定的結構,利用結構化的數據採取一定的搜索算法加快速度。把非結構化數據中提取出的然後重新組織的信息,稱之爲索引。比如字典,字典的拼音表和部首檢字表就是相當於字典的索引,對每一個字的解釋就是非結構化的,如果字典沒有音節表和部首檢字表,在茫茫辭海中找一個字只能順序掃描。

然而字的某些信息可以提取出來進行結構化處理,比如讀音,就比較結構化,分聲母和韻母,分別只有幾種可以一一列舉,於是將讀音拿出來按一定的順序排列,每一項讀音都指向此字的詳細解釋的頁數。我們搜索時按結構化的拼音搜到讀音,然後按其指向的頁數,便可找到我們的非結構化數據——也即對字的解釋。
這種先建立索引,在對索引進行搜索的過程叫全文檢索

全文檢索大體分兩個過程,索引創建(Indexing)搜索索引(Search)
索引創建:將現實世界中所有的結構化和非結構化數據提取信息,創建索引的過程。
搜索索引:通過用戶的查詢請求搜索創建的索引,然後返回查詢結果的過程。

ElasticSearch是什麼?

Elasticsearch 簡稱 ES,其是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java語言開發的,並作爲Apache許可條款下的開放源碼發佈,是一種流行的企業級搜索引擎。Elasticsearch用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。官方客戶端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和許多其他語言中都是可用的。

在2016年1月,ElasticSearch已超過Solr等,成爲排名第一的搜索引擎類應用。

Elasticsearch是與名爲Logstash的數據收集和日誌解析引擎以及名爲Kibana的分析和可視化平臺一起開發的。這三個產品被設計成一個集成解決方案,稱爲“Elastic Stack”,又叫做 ELK

ES Lucene Solr 區別

Lucene

Lucene是一個Java全文搜索引擎,完全用Java編寫。Lucene不是一個完整的應用程序,而是一個代碼庫和API,是一個開放源代碼的全文檢索引擎工具包,可以很容易地用於嚮應用程序添加搜索功能,使用起來比較複雜。

ES

ES 是基於Lucene 這個代碼庫進一步封裝編寫的 一個全文檢索引擎,隱藏Lucene的複雜性,從而讓全文搜索變得簡單。

Solr

Solr 是Apache下的一個頂級開源項目,採用Java開發,它是基於Lucene的全文搜索服務器。相對於es 比較重量級

ElasticSearch vs Solr

(1)es基本是開箱即用,非常簡單。Solr比之更爲複雜

(2)Solr 利用 Zookeeper 進行分佈式管理,而 Elasticsearch 自身帶有分佈式協調管理功能。

(3)Solr 支持更多格式的數據,比如JSON、XML、CSV,而 Elasticsearch 僅支持json文件格式。

(4)Solr 官方提供的功能更多,而 Elasticsearch 本身更注重於核心功能,高級功能多有第三方插件提供,例如圖形化界面需要kibana友好支撐

(5)Solr 查詢快,但更新索引時慢(即插入刪除慢),用於電商等查詢多的應用;

ES建立索引快(即查詢慢),即實時性查詢快,用於facebook新浪等搜索。

Solr 是傳統搜索應用的有力解決方案,但 Elasticsearch 更適用於新興的實時搜索應用。

(6)Solr比較成熟,有一個更大,更成熟的用戶、開發和貢獻者社區,而 Elasticsearch相對開發維護者較少,更新太快,學習使用成本較高。

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