使用lucene檢索過程中如果用到rangequery,prefixquery,wildcardquery,fuzzyquery等query的時候,可能會產生 toomanyclauses異常。為什麼呢?
以 rangequery為例,如果日期範圍為 19990101到 20091231,在索引檔案中有 19990102,19990103等等這些日期片語,那麼rangequery 會被擴充套件成「19990102 or 19990103」,成了2 個子句。可以想象,如果索引檔案裡面在這個時間段內的日期有很多,那麼就會產生很多子句。 prefixquery 等也是同樣的道理,如查詢詞為「法*」,如果索引檔案中有「法律」、「法場」、「法醫」、「法典」等等,這個 query就會被擴充套件成「法律 or 法場 or 法醫 or 法典」,或許會更多更多。 而為了節省記憶體,lucene 預設將子句數目限制為 1024,如果超出限制,就會丟擲toomanyclauses異常。 怎麼解決這個問題呢,lucene提供了三種方法:
(1) 使用 filter 替代 query,當然這是以犧牲查詢速度為代價的,不過可以通過快取的方式緩解這個問題。仍然以前面 rangequery 為例,可以使用rangefilter來替代 rangequery,如下:
之前的**:
booleanquery ******query = new booleanquery();
term datelower = new term("publishdate", startyear + "0101");
term dateupper = new term("publishdate", endyear + "1231");
rangequery datequery = new rangequery(datelower, dateupper, true);
******query.add(datequery, occur.must);
之後的**:
booleanquery ******query = new booleanquery();
rangefilter datefilter = new rangefilter("publishdate", startyear + "0101", endyear + "1231",
true, true);
filteredquery filteredquery = new filteredquery(******query, datefilter); 518
(2) 通過 booleanquery.setmaxclausecount(10240)來限制數目。這樣會加大記憶體的消耗。使用 booleanquery.setmaxclausecount(integer.max_value),可以完全去掉這個限制。
(3) 對於範圍查詢,可以盡可能的降低精度,比如如果查詢不需要精確到月份與日期,只需
要精確到年,據說可以使用 datetools這個類可以很簡單解決時間轉化問題。
lucene中的刪除索引
今天在測試lucene的刪除索引中遇到乙個問題 測試 如下 protected void setup throws exception public void testdeleteindex throws exception 在測試中,首先重建索引 見setup方法 在測試方法中可以看出 1 刪除前...
lucene中的刪除索引
今天在測試lucene的刪除索引中遇到乙個問題 測試 如下 protected void setup throws exception public void testdeleteindex throws exception 在測試中,首先重建索引 見setup方法 在測試方法中可以看出 1 刪除前...
Lucene中的範圍搜尋
前兩天做有關lucene的範圍搜尋,覺得應該很簡單,因為之前做過lucene的排序。但一做就發現不那麼回事,做排序程式幾乎不需要改動,但範圍搜尋完全不同。下面就3個方面 整數,浮點數,日期 來說 前提 使用lucene1.9.1,將整數,浮點數和日期全部以如下方式建索引 newfield key,v...