Elasticsearch系列(一)—全文檢索

Elasticsearch系列(一)—全文檢索

前言

大家好,牧碼心今天給大家推薦一篇Elasticsearch系列(一)—全文檢索的文章,在實際工作中有很多應用場景,希望對你有所幫助。內容如下:

  • 背景
  • 什麼是全文檢索
  • 爲什麼使用全文檢索
  • 什麼時候使用全文檢索
  • 全文檢索的流程
  • 主流開源框架:Lucene,Solr,ElasticSearch

背景

談到搜索引擎,大家都會聯想到百度,谷歌等商業搜索工具。各大垂直網站,如電商,新媒體,汽車等行業網站也都有搜索功能。搜索引擎在互聯網的方方面面都有應用。什麼是搜索引擎呢?百度百科定義:

搜索引擎是指根據一定的策略、運用特定的計算機程序從互聯網上採集信息,在對信息進行組織和處理後,爲用戶提供檢索服務,將檢索的相關信息展示給用戶的系統。搜索引擎是工作於互聯網上的一門檢索技術,它旨在提高人們獲取蒐集信息的速度,爲人們提供更好的網絡使用環境。從功能和原理上搜索引擎大致被分爲全文搜索引擎、元搜索引擎、垂直搜索引擎和目錄搜索引擎等四大類。

通俗的說,搜索,就是在特定場景下,通過語音或文字輸入關鍵詞來尋找需要的信息。

什麼是全文檢索

全文檢索是搜索引擎的原理之一,在網絡上的大部分搜索服務都用到了全文檢索技術。什麼是全文檢索?百度百科定義:

全文搜索引擎是目前廣泛應用的主流搜索引擎。它的工作原理是計算機索引程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時,檢索程序就根據事先建立的索引進行查找,並將查找的結果反饋給用戶的檢索方式。這個過程類似於通過字典中的檢索字表查字的過程。

爲了更好的理解全文檢索,先從常見的數據類型說起。常見的數據類型總體可分爲:結構化數據和非結構化數據。

  • 結構化數據:指具有固定格式或有限長度的數據,如數據庫,元數據等。
  • 非結構化數據:非結構化數據又可稱爲全文數據,指不定長或無固定格式的數據,如郵件,文檔,視頻等。
  • 半結構化數據:如定義好的xml,json等結構的數據,根據需要可按結構化數據來處理,也可抽取出純文本按非結構化數據來處理。
    對於結構化數據,我們一般都是可以通過關係型數據庫(mysql,oracle等)的方式存儲和搜索,也可以建立索引。

對於非結構化數據,主要有兩種方法:順序掃描法,全文檢索

  • 順序掃描法
    所謂順序掃描,比如要找內容包含某一個字符串的文件,就是一個文檔一個文檔的看,對於每一個文檔,從頭看到尾,如果此文檔包含此字符串,則此文檔爲我們要找的文件,接着看下一個文件,直到掃描完所有的文件。如利用windows的搜索也可以搜索文件內容,只是相當的慢
  • 全文檢索
    對非結構化數據順序掃描很慢,我們是否可以進行優化?,我們可將非結構化數據中的一部分信息提取出來,重新組織,使其變得有一定結構,然後對此有一定結構的數據進行搜索,從而達到搜索相對較快的目的。這部分從非結構化數據中提取出的然後重新組織的信息,我們稱之索引
    例如:書籍,書籍中包含大量的文本,圖片等非結構化數據,如果需要找其中某個詞或段,甚至章節,在沒有目錄和頁碼的前提下,需要在整個書籍中一個一個詞順序的去掃描。而目錄則可優化檢索效率,我們將數據分爲章節,段落,並標識出對應的頁碼,從而達到結構化處理。我們檢索時,根據頁碼定位到需要查找的非結構化數據。這種先建立索引,再對索引進行搜索的過程就叫全文檢索(Full-text Search)。

爲什麼使用全文檢索

我們平時接觸到mysql,oracle等關係型數據庫裏都提供了查詢檢索或者聚合分析功能,我們大部分的查詢功能都可以通過數據庫查詢獲得,如果查詢效率低下,還可以通過建數據庫索引,優化SQL等方式進行提升效率,甚至通過引入緩存來加快數據的返回速度。如果數據量更大,就可以分庫分表來分擔查詢壓力。那爲什麼還需要全文檢索的搜索引擎呢?我們主要從以下幾個方面分析:

  • 數據類型
    全文索引搜索支持非結構化數據的搜索,可以更好地快速搜索大量存在的任何單詞或單詞組的非結構化文本。
    例如 Google,百度類的網站搜索,它們都是根據網頁中的關鍵字生成索引,我們在搜索的時候輸入關鍵字,它們會將該關鍵字即索引匹配到的所有網頁返回;還有常見的項目中應用日誌的搜索等等。對於這些非結構化的數據文本,關係型數據庫搜索不是能很好的支持。
  • 索引維護
    一般關係型數據庫,全文檢索都實現的很雞肋,因爲一般也沒人用數據庫存文本字段。進行全文檢索需要掃描整個表,如果數據量大的話即使對SQL的語法優化,也收效甚微。建立了索引,但是維護起來也很麻煩,對於 insert 和 update 操作都會重新構建索引。

什麼時候使用全文檢索

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

全文檢索的流程

我們先梳理下全文檢索的流程,流程如圖所示:
全文檢索的流程
1.綠色表示索引過程,對要搜索的原始內容進行索引構建一個索引庫,索引過程包括:

確定原始內容即要搜索的內容->採集文檔->創建文檔->分析文檔->索引文檔;

2.紅色表示搜索過程,從索引庫中搜索內容,搜索過程包括:
用戶通過搜索界面->創建查詢->執行搜索,從索引庫搜索->渲染搜索結果;

整個過程分爲:

  • 創建索引
    創建索引也就是對文檔索引的過程,將用戶要搜索的文檔內容進行索引,索引存儲在索引庫(index)中。需要對語彙單元索引,通過詞語找文檔,這種索引的結構就叫做叫倒排索引結構。
    倒排索引結構是根據內容(詞語)找文檔,如下圖:
    倒排索引結構
    倒排索引結構也叫反向索引結構,包括索引和文檔兩部分,索引即詞彙表,它的規模較小,而文檔集合較大。
    有倒排索引,則也有正向索引。 正向索引其實就是順序掃描所有文件,這樣本身效率是極低的。
  • 查詢索引
    查詢索引也是搜索的過程。搜索就是用戶輸入關鍵字,從索引(index)中進行搜索的過程。根據關鍵字搜索索引,根據索引找到對應的文檔,從而找到要搜索的內容。
    比如我們使用百度搜索全文檢索時,爲我們展示的是相關網頁地址,再根據地址找到具體的文檔內容。

主流開源框架:Lucene,Solr,ElasticSearch

  • Lucene
    Lucene是一個Java全文搜索引擎,完全用Java編寫。Lucene不是一個完整的應用程序,而是一個代碼庫和API,可以很容易地用於嚮應用程序添加搜索功能。
    但是Lucene的API過於底層,並不簡單易用,而且缺乏企業級的管理工具對其進行監控管理,於是企業級的全文檢索引擎就應運而生了,目前最流行的兩個就是:Solr和ES。他們都是建立在Lucene之上的。

  • Solr
    Solr是一個基於名爲Lucene的Java庫構建的開源搜索平臺。它以用戶友好的方式提供Apache Lucene的搜索功能。作爲一個行業參與者近十年,它是一個成熟的產品,擁有強大而廣泛的用戶社區。它提供分佈式索引,複製,負載平衡查詢以及自動故障轉移和恢復。如果它被正確部署然後管理得好,它就能夠成爲一個高度可靠,可擴展且容錯的搜索引擎。很多互聯網巨頭,如Netflix,eBay,Instagram和亞馬遜(CloudSearch)都使用Solr,因爲它能夠索引和搜索多個站點。

  • ElasticSearch
    ElasticSearch是一個實時的,可擴展的分佈式RESTful搜索引擎,它可以用於全文搜索,結構化搜索以及分析。由於Lucene過於複雜,不方便使用。Elasticsearch使用Lucene作爲內部引擎,使用Elasticsearch做搜索引擎時,只需要使用統一的API就可以,而不需要了解複雜的Lucene原理。
    分佈式搜索引擎包括可以劃分爲分片的索引,並且每個分片可以具有多個副本。每個Elasticsearch節點都可以有一個或多個分片,其引擎也可以充當協調器,將操作委派給正確的分片。
    Elasticsearch提供功能,包括主要功能列表包括:

    • 分佈式搜索
    • 多租戶
    • 分析搜索
    • 分組和聚合

Solr、ElasticSearch 對比

由於Lucene的複雜性,一般很少會考慮它作爲搜索的第一選擇,排除一些公司需要自研搜索框架,底層需要依賴Lucene。所以這裏我們重點分析 Elasticsearch 和 Solr。
Elasticsearch vs. Solr。哪一個更好?他們有什麼不同?你應該使用哪一個?具體看如下圖比較:瞭解更多
Solr、ElasticSearch 對比

總結

本文主要介紹了搜索引擎背景,全文檢索和主流的開源框架對比。總的來說ElasticSearch在近幾年已經發展很迅速,基於ElasticSearch的生態圈也在擴大,如:kibana,logstash,beats等。相信ElasticSearch未來會成爲搜索引擎的主流開源框架。

參考地址

  • https://www.cnblogs.com/jajian/p/9801154.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章