1. 程式人生 > >ElasticSearch之高亮使用-plian、postings 、fvh 實現原理、差異

ElasticSearch之高亮使用-plian、postings 、fvh 實現原理、差異

         很多應用場景下,搜尋帶高亮顯示可以較好的改善使用者體驗。常用的企業搜尋引擎Elasticsearch、Solr中均提供了高亮的功能。Elasticsearch、Solr中的高亮顯示是均來源於lucene的高亮模組,luncene允許在一個或者多個欄位上突出顯示搜尋內容,在中高亮方式上,lucene支援三種高亮顯示方式highlighter, fast-vector-highlighter, postings-highlighter,  在Solr、ElasticSearch,highlighter 高亮是預設配置高亮方式。

highlighter:

     highlighter 高亮也叫plain

高亮,highlighter方式高亮是個實時分析處理高亮器。即使用者在查詢的時候,搜尋引擎查詢到了目標資料docid後,將需要高亮的欄位資料提取到記憶體,再呼叫該欄位的分析器進行處理,分析器對文字進行分析處理,分析完成後採用相似度演算法計算得分最高的前n組並高亮段返回資料。以ansj分析器為例,官方給出的效能在60-80萬字/每秒,但實際上中伺服器執行效率會小於該值(伺服器主頻都比較低),在生產環境下,ansj分詞效率大多在 40-50萬字/秒。假設使用者搜尋的都是比較大的文件同時需要進行高亮。按照一頁查詢40條(每條資料20k)的方式進行顯示,即使相似度計算以及搜尋排序不耗時,整個查詢也會被高亮拖累到接近兩秒。
highlighter高亮器是實時分析高亮器,這種實時分析機制會讓ES佔用較少的IO資源同時也佔用較少的儲存空間(詞庫較全的話相比fvh方式能節省一半的儲存空間),其實時計算高亮是採用cpu資源來緩解io壓力,在高亮欄位較短(比如高亮文章的標題)時候速度較快,同時因io訪問的次數少,io壓力較小,有利於提高系統吞吐量。


fast-vector-highlighter :

      為解決 highlighter 高亮器質大文字欄位上高亮速度跟不上的問題,lucene高亮模組提供了基於向量的高亮方式 fast-vector-highlighter(也稱為fvh)。fast-vector-highlighter(fvh

)高亮器利用建索引時候儲存好的詞向量來直接計算高亮段落,在高亮過程中比plain高亮方式少了實時分析過程,取而代之的是直接從磁碟中將分詞結果直接讀取到記憶體中進行計算。故要使用fvh的前置條件就是在建索引時候,需要配置儲存詞向量,詞向量需要包含詞位置資訊、詞偏移量資訊。

fvh在高亮時候的邏輯如下:

    1.分析高亮查詢語法,提取表示式中的高亮詞集合
    2.從磁碟上讀取該文件欄位下的詞向量集合
    3.遍歷詞向量集合,提取自表示式中出現的詞向量
    4.根據提取到目標詞向量讀取詞頻資訊,根據詞頻獲取每個位置資訊、偏移量
    5.通過相似度演算法獲取得分較高的前n組高亮資訊

    6.讀取欄位內容(多欄位用空格隔開),根據提取的詞向量直接定位擷取高亮欄位

      由此可見,fvh 省去了實時分析過程,但是多了詞條向量資訊儲存和讀取,在詞庫豐富的系統中,儲存詞向量往往要比不儲存詞向量多佔用一倍的空間,同時在高亮時候會比plain高亮多出至少一倍的io操作次數,讀取的位元組大小也多出至少一倍,大量的io請求會讓搜尋引擎併發能力降低。

    中實際的使用過程中,當實時分詞速度小於磁碟讀隨機取速度的時候,從磁碟讀取詞詞條向量結果的的fast-vector-highlighter高亮有明顯優勢,例如: ansj分詞器處理1百萬字的文件耗時約兩秒,而當前企業硬碟一分鐘轉速約為一萬轉,即一秒鐘有160次的定址能力,單次定址並讀取20k耗時約為7-10ms。分40次從磁碟總共讀取2M內容耗時約為300毫秒,重複讀取資料時候io上存在快取,速度較快,與plain方式相比,fvh高亮在文件欄位內容較大的情況下具有較大優勢,特別是在使用ssd的情況下。

postings-highlighter :

         預設plain高亮方式佔用空間小,但是對大欄位高亮慢,fvh對大欄位高亮快,但佔用空間過大,為此,lucene還提供了一佔用空間不是太大,高亮速度不是太慢的的折中方案-postings-highlighter(也稱postings)。postings 高亮方式與fvh相似,採用詞量向量的方式進行高亮,與fvh高亮不同的是postings高亮只儲存了詞向量的位置資訊,並未儲存詞向量的偏移量,故中大欄位儲存中,postings其比fvh節省約20-30%的儲存空間,速度與fvh基本相當。

      在實際使用中,postings高亮的優點和缺點都不突出,故建議開發者在做高亮需求時候,可對小欄位採用highlighter高亮方式,大欄位採用fast-vector-highlighter即可滿足需求。