1. 程式人生 > >java Lucene全文檢索優化方法

java Lucene全文檢索優化方法

一. .索引優化背景

很多網站都有自己的搜尋引擎,比如百度,搜狗等等,而他們每天新增的索引量可想而知多麼龐大,所以為了能提升使用者的搜尋響應速度,好的優化方案必不可少;當然對於一些網站的站內搜尋也很有必要,否則日積月累之後,索引檔案也將難以維護,搜尋效率越來越慢,使用者好評率自然降低。

由於我所在的公司也用到Lucene做搜尋,所以相應學習了下。

二. .索引優化方法

目前來說有幾種比較常見的優化方法:

1.  設定IndexWriterConfig中mergeFactor的值.

         mergeFactor即合併因子,當大小相當的段的數量達到此值的時候開始合併。

注意:mergeFactor應設在(2-10)之間,mergeFactor越小,建立索引的時候佔用記憶體越小,所以建立索引速度慢,但是反向索引時速度快;

  mergeFactor越大,建立索引的時候佔用記憶體越大,所以建立索引速度快,但是反向索引時速度慢。

合併策略:比如 mergeFactor=3,開始來的段大小為 10M,當湊夠 3 個 10M 的時候, 0.cfs, 1.cfs, 2.cfs則合併成一個新的段 3.cfs,大小為 30M,然後再來 4.cfs, 5.cfs, 6.cfs,合併成 7.cfs,大小為 30M,然後再來 8.cfs, 9.cfs, a.cfs 合併成 b.cfs, 大小為 30M,這時候又湊夠了 3 個30M 的,合併成 90M 的 c.cfs,然後又來 d.cfs, e.cfs, f.cfs 合併成 10.cfs,大小為 30M,然後 11.cfs 大小為 10M,這時候硬碟上的段為: c.cfs(90M) 10.cfs(30M),11.cfs(10M)。

 2. 排除停用詞

 什麼是停用詞?停用詞就是沒有實際意義不參與索引的詞。比如,"這是一首簡單的小情歌!"其中‘這是’、‘的’就可以當做停用詞排除掉,被分詞器過濾掉後,就不會建立索引,這樣索引檔案就會變小,搜尋的時候就會變快。在庖丁分詞器中,就可以自定義停用詞和自己的詞典。

3. 將索引資料分割槽存放

為什麼要分割槽存放?假如咱們手上有海量的各種資料,比如音訊,小說,新聞,遊戲。。如果分割槽存放的話,使用者只需在小範圍區間搜尋就行了,可以很大程度提高檢索速度減少伺服器壓力。這在某種方式上類似於分流。

4. 將硬碟上的索引檔案放入記憶體中提升索引速度

//索引放在硬碟上
Directory dir = FSDirectory.open(new File(indexPath));
//索引放在記憶體中
IOContext ioc = new IOContext();
Directory  ramDic = new RAMDirectory(dir, ioc);
//然後將ramDic傳入IndexReader
IndexReader reader = DirectoryReader.open(ramDic);
IndexSearcher searcher = new IndexSearcher(reader);
//...
5. 在查詢時優化

查詢分為TermQuery(以term為單位查詢)、MultiFieldQueryParser(字串查詢,將字串分割為單個字元)、MatchAllDocsQuery(查詢所有)、NumericRangeQuery(範圍查詢,效能較過濾器高)、WildcardQuery(萬用字元查詢,?為佔位符,*匹配所有)、FuzzyQuery(模糊查詢,其中構造器第二個引數代表可缺少字元數)