1. 程式人生 > >lucene索引文件大小優化小結

lucene索引文件大小優化小結

滿足 core price 數據庫 值類型 數值類型 2.4 field com

1 數值數據類型索引優化

1.1 數值類型索引問題

lucene本質上是一個全文檢索引擎而非傳統的數據庫系統,它基於倒排索引,非常適合處理文本,而處理數值類型卻不是強項。

1.2 lucene解決方法

為解決這一問題, Schindler和 Diepenbroek提出了基於trie的解決方法,此方法08年發表在 Computers & Geosciences (地理信息科學sci期刊,影響因子1.9)

1.3 索引文件大小優化方案

我們的應用中很多field都是數值類型,比如id、avescore(評價分)、price(價格)等等,但是用於區間範圍查詢的數值類型非常少,大部分都是直接查詢或者為進行排序使用。

因此優化方法非常簡單,將不需要使用範圍查詢的數字字段設置precisionstep為Intger.max,這樣數字寫入倒排僅存一個term,能極大降低term數量。

1.4 效果

優化之後效果明顯,索引壓縮包大小直接減少了一倍。

2 空間數據類型索引優化

2.1 地理數據索引問題

還是一樣的話,lucene基於倒排索引,非常適合文本,而對於空間類型數據卻不是強項。

舉個應用場景,每一個商家都有唯一的經緯度坐標(x, y),用戶想篩選附近5千米的商家。

2.2 lucene解決方法

lucene采用geohash的方法對經緯度進行編碼(geohash介紹參見:GeoHash)。簡單描述下,geohash對空間不斷進行劃分並對每一個劃分子空間進行編碼,比如我們整個北京地區被編碼為“w”,那麽再對北京一分為4,某一子空間編碼為“WX”,對“WX”子空間再進行劃分,對各個子空間再進行標識,例如“WX4”(簡單可以這麽理解)。

2.3 索引文件大小優化方案

上述方法本質上也是一種以空間換時間的方法,比如一個經緯度(x,y),只有兩個字段,但是以geohash進行編碼將產生許多term並寫入倒排。

lucene默認最長的geohash長度為24,也就是一個經緯度將以24個字符串的形式來寫入到倒排中。最初采用的geohash長度為11,但實際上針對我們的需求,geohash長度為9的時候已經足夠滿足我們的需求(geohash長度為9大約代表了5*4米的格子)。

2.4 效果

此優化效果結果未做記錄,不過經緯度geohash編碼占據了term數量的25%,而我們又將geohash長度從11減少到9(降低18%),相當於整個term數量降低了25%*18%=4.5%。

3 只索引不存儲

上面兩種方法本質上通過減少term數量來減少索引文件大小,下面的方法走的是另一種方式。

從lucene查出一堆docid之後,需要通過docid找出相應的document,並找出裏面一些需要的字段,例如id,人均消費等等,然後返回給客戶端。但實際上我們只需要獲取id,通過這些id再去請求DB/Cache獲取額外的字段。

因此優化方法是只存儲id等必須的字段,對於大部分字段我們只索引而不存儲,通過這種方法,索引壓縮文件降低了10%左右。

4 小結

本文基於lucene的一些基礎原理以及自身業務,對索引文件大小進行了優化,使得索引文件大小下降了一半多。

此文作為學習筆記記錄,感謝原文作者https://www.cnblogs.com/LBSer/p/4068864.html

lucene索引文件大小優化小結