ElasticSearch之高亮使用-plian、postings 、fvh 實現原理、差異
很多應用場景下,搜尋帶高亮顯示可以較好的改善使用者體驗。常用的企業搜尋引擎Elasticsearch、Solr中均提供了高亮的功能。Elasticsearch、Solr中的高亮顯示是均來源於lucene的高亮模組,luncene允許在一個或者多個欄位上突出顯示搜尋內容,在中高亮方式上,lucene支援三種高亮顯示方式highlighter, fast-vector-highlighter, postings-highlighter, 在Solr、ElasticSearch,highlighter 高亮是預設配置高亮方式。
highlighter:
highlighter 高亮也叫plain
fast-vector-highlighter :
為解決 highlighter 高亮器質大文字欄位上高亮速度跟不上的問題,lucene高亮模組提供了基於向量的高亮方式 fast-vector-highlighter(也稱為fvh)。fast-vector-highlighter(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即可滿足需求。