ELK之搜索引擎介紹(一)

大家都知道搜索搜引擎是什麼,例如我們接觸比較多的 百度、Google、必應、360搜索、淘寶搜索、京東搜索等等很多只要能搜索就可以被稱爲搜索引擎。以下是比較官方的說法。

搜索引擎(Search Engine)是根據一定的策略、運用特定的計算機程序去搜集信息,在對信息進行組織和處理後,爲用戶提供檢索服務,將用戶檢索相關的信息展示給用戶的一套系統。

搜索引擎的組成

搜索引擎一般由索引組件搜索組件所組成。

搜索引擎的工作原理

圖解:

搜索引擎的工作順序

索引組件:獲取數據-->建立文檔-->文檔分析-->文檔索引(倒排索引)
搜索組件:用戶搜索接口-->建立查詢(將用戶鍵入的信息轉換爲可處理的查詢對象)-->搜索查詢-->展現結果

索引組件

注意:索引組件爲上圖中紅色框部分
爲什麼索引組件的工作流程是由下往上呢?
舉例:例如淘寶,當我們在淘寶中搜索一件商品的時候,在能搜索到的前提下,那它這個商品肯定是提前要存儲到淘寶的存儲庫當中,淘寶賣家把一件衣服上架到了淘寶平臺,這就叫做 Raw Content(原始內容);當衣服存儲到淘寶的存儲庫當中呢,搜索引擎就開始獲取這件衣服的圖片信息和標題內容等,獲取到的內容會被存爲文檔才能供搜索引擎使用,這個叫 Acquire Content獲取內容;存爲文檔之後,一般來說,一句話或者一條信息都可以作爲一個文檔,但是現在需要建立文檔 Build Document,建立文檔的過程是向單個文檔插入權重值,目的是爲了在搜索引擎搜索的時候進行排序,當然是權值越高越容易被搜索到了哈,不然不會出現SEO的。文件建立成功後,搜索引擎還不能直接對文本進行索引呢,還需要將文檔即文本內容分割成獨立的元素,可以理解爲切片、分詞等,把一句話拆分成了好多個字或者說字節;切詞過後,文檔就要被加上索引列表啦,即我們搜索的時候,通過索引會給你搜索到1-10的數字、搜索2的時候會給你搜索到2-20的數字等,這就叫做添加索引 Idenx Document。這一系列統統被稱爲索引組件來完成的工作,接下來就等着被搜索引擎搜索吧。

淘寶的搜索框就是我們的用戶搜索界面 Search User Interface,當我們在search interface輸入東西去搜索內容的時候瀏覽器會把你輸入的內容轉換爲HTML或Ajax的格式提交給搜索引擎服務器,即淘寶的搜索引擎服務器,由瀏覽換轉換你輸入內容的步驟叫做建立查詢Build Query;當查詢建立後,淘寶的搜索引擎就會拿着你輸入的內容去存儲庫中尋找相匹配的內容,會直接查詢上述步驟中已經建立好的索引,此步驟叫做搜索查詢 Run Query;搜索到相匹配內容後,就要通過界面展現給你,淘寶的搜索引擎拿到數據後返回到你的瀏覽器當中,一次完整的搜索就此完成,此步驟叫做Render Results展現結果。

索引是一種數據結構,它允許對它存儲在其中的單詞進行快速隨機訪問。當需要從大量文本中快速檢索文本目標時,必須首先將文本內容轉換成能夠進行快速搜索的格式,以建立針對文本的索引數據結構,此即爲索引過程。

獲取內容(Acquire Content)

由用戶輸入原始內容(Raw Content),然後由索引組件去獲取內容(Acquire Content),是通過網絡爬蟲或其它方式來蒐集需要索引的內容。Lucene並不提供任何獲取內容的組件,因此,需要由其它應用程序負責完成這一項功能,例如入著名的開源爬蟲程序Solr、Nutch、Grub及Aperture等。必要時還可以自行開發相關程序以高效獲取自有的特定環境中的數據。獲取到的內容需要剪切爲小數據塊,即文檔(Document)。

建立文檔(Build Document)

通過Acquire Centent獲取的原始內容需要轉換爲專用部件(文檔)才能供搜索引擎使用。
一般來說,一個網頁、一個PDF文檔、一封郵件或者一條日誌信息都可以作爲一個文檔。文檔由帶“值(Value)”的"域(Field)"組成,例如標題(Title)、正文(body)、摘要(abstract)、作者(Author)和鏈接(url)等。不過,二進制格式的文檔處理起來要麻煩一些,例如PDF文檔。對於建立文檔的過程來說有一個常見操作:向單個的文檔和域中插入加權值,以便在搜索結果中對其進行排序。權值可在索引操作前靜態生產,也可在搜索期間才動態生成。權值決定了其搜索相關度。

文檔分析(Analyze Document)

搜索引擎不能直接對文本進行索引,確切地說,必須首先將文本分割成一系列被稱爲語彙單元(token)的獨立原子元素,此過程即爲文檔分析。每個token大致能與自然語言中的“單詞”對應起來,文檔分析就是用於確定文檔中的文本域如何分割成token序列。
此即爲切詞或分詞。
文檔分析中要解決的問題包括如何處理連接一體的各個單詞、是否需要語法修正(例如原始內容存在錯別字、是否需要向原始token中插入同義詞)、是否需要將大寫字符統一轉換爲小寫字符,以及是否將單數和複數格式的單詞合併成同一個token等。這通常需要詞幹分析器等來完成此類工作,Lucene提供了大量內嵌的分析器,也支持用戶自定義分析器,甚至聯合Lucene的token工具和過濾器創建自定義的分析鏈。

文檔索引(Idenx Document)

在索引步驟中,文檔將被加入到索引列表。事實上,Lucene爲此僅提供了一個非常簡單的API,而後自行內生地完成了此步驟的所有功能。

搜索組件

索引處理就是從索引中查找單詞,從而找到包含該單詞的文檔的過程。搜索質量主要由查準率(Precision)和查全率兩個指標進行衡量。
查準率用來衡量搜索系列過非相關文檔的能力。
而查全率用來衡量搜索系統查找相關文檔的能力。
另外,除了快速搜索大量文本和搜索速度之後,搜索過程還涉及到了許多其它問題,例如單項查詢、多項查詢、短語查詢、通配符查詢、結果ranking和排序,以及友好的查詢輸入方式等。這些問題的解決,通常需要多個組件協作完成。

用戶搜索界面(Search User Interface)

UI(User Interface)是搜索引擎的重要組成部分,用戶通過搜索引擎進行搜索交互時,他們會提交一個搜索請求,該請求需要先轉換成合適的查詢對象格式,以便搜索引擎能執行查詢。

建立查詢(Build Query)

用戶提交的搜索請求通常以HTML表單或Ajax請求的形式由瀏覽器提交到搜索引擎服務器,因此,需要事先由查詢解析器一類的組件將這個請求轉換成搜索引擎使用的查詢對象格式。

搜索查詢(Run Query)

當查詢請求建立完成後,就需要查詢檢索索引並返回與查詢語句匹配的並根據請求排好序的文檔。搜索查詢組件有着複雜的工作機制,他們通常根據搜索理論模型執行查詢操作。常見的搜索理論模型由純布爾模型、向量空間模型及概率模型三種。Lucene採用了向空間模型和純布爾模型。

展現結果(Render Results)

查詢獲得匹配查詢語句並排好序的文檔結構集後,需要用直觀、經濟的方式爲用戶展現結果。UI也需要爲後續的搜索或者操作提供清晰的嚮導,如完善搜索結果、尋找與匹配結果相似的文檔、進入下一頁等。

但這是一套搜索引擎的流程,我們要通過什麼實現呢?

圖解ELK組件

下面來圖解完成一套搜索引擎的應用組件

上圖顯示爲Kibana組件來代替用戶搜索接口(Search User Interface)功能,還要提供了一個Web界面供用戶搜索。
上圖顯示爲Elasticsearch組件來代替建立查詢(Build Query)和搜索查詢(Run Query)以及把搜索結果返回給用戶接口的展現結果(Render Results)功能。
上圖顯示爲Lucene組件來代替文檔索引(Index Document)和文檔分析(Analyze Document)的功能。
上圖顯示爲Logstash組件來代替原始內容(Raw Content)和獲取內容(Acquire Content)及構建文檔(Build Document)的功能。

Elastic Stack

其中Elasticsearch和Logstash及Kibana這三款組件都是Elastic公司旗下的產品
Elastic Stack:
Elasticsearch
Logstash/Beats
Kibana
這三款工具本來是被稱爲ELK的後來被更名爲Elastic Stack,爲什麼會出現這種情況呢?
因爲Logstash被用來作爲日誌的抽取工具實在是弱爆了,性能非常差,硬件資源消耗大,因爲Logstash使用JRuby所研發,我們知道Python使用C語言所研發,Ruby也是使用C語言所編寫,而JRuby卻是用Java所研發,Java本來就很慢,而還用Java寫Ruby成爲了JRuby,那更是慢上加慢,Ruby這樣的動態語言比較適合做Web網站的快速開發,但是像日誌採集的後端應用,需要負責日誌的採集和解析,尤其像解析日誌會很耗CPU資源的,這樣大的日誌數據量更容易碰天花板。
所以後來就有人用GoLang重寫了一款工具叫Beats,Beats被稱爲輕量型數據採集器。Beats平臺集合了多種單一用途的數據採集器,他們從成百上千或成千上萬臺機器和系統向Logstash或Elasticsearch發送數據。
爲什麼有了Beast還要向Logstash發送數據呢?爲什麼不直接取代Logstash呢?
因爲Beast雖然好用,也很強大,但Logstash的一部分功能Beast還是不具備的。所以還會依然會用到Logstash。

ES的核心組件

物理組件:
        集羣:
            集羣狀態:green, yellow, red
        節點:
        Shard:

    Lucene的核心組件:
        索引(index):數據庫
        類型(type):表
        文檔(Document):行
        映射(Mapping):

    域選項:來控制Lucene將文檔添加進域索引後對該域執行的操作:
        Index.ANALYZED:切詞和分析;
        Index.NOT_ANALYZED:做索引,但不做分析;
        Index.NO:不做索引;

Lucene是Apache旗下的一款非常出色的項目,提供基於Java的索引和搜索技術,以及拼寫檢查,命中突出顯示和高級分析/標記化功能。

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