1. 程式人生 > >Lucene的版本迭代

Lucene的版本迭代

Lucene已經發展到Lucene 7了,不過,Lucene 7是一個前瞻性的版本,其實,Lucene還在同時升級Lucene5 和Lucene6.
Lucene在之前的版本迭代中,不斷嘗試新的設計思想,不斷引入新的與時俱進的功能。這也導致Lucene的大版本不相容,在我之前的專案中,從Lucene2升級到Lucene4,再升級到Lucene6,都不能平滑過渡,需要修改專案中使用到Lucene的部分程式碼。

從Lucene 1.4.3升級到Lucene 2.1

2004年7月,Lucene釋出第一個版本Lucene 1.4。多年後的2007年才釋出Lucene 2,其中,Lucene 2.4.0使用的最廣泛。從Lucene 1.4.3升級到Lucene 2.1,可能需要了解這些改變:

  1. 對Field的設計更加合理,使用內部類來區分Field的具體型別:
    Field(String name,String value,boolean store,boolean index)
    更改為了:
    Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)
  2. BooleanQuery的add方法也改了,原有的是
    add(Query q, boolean required, boolean prohibited)
    現在也更加面向物件了:
    add(Query q, BooleanClause.Occur occur)
  3. QueryParser的parse方法不再是static的了,需要先獲取QueryParser例項。
  4. IndexReader類方法簽名有稍許改動。

從Lucene 2 升級到Lucene 3.x

Lucene 於2009年11月釋出了 Lucene 3.0,這一版本改動了很多API,並加入了Java5的新特性:如泛型、可變引數、列舉。從Lucene 2 升級到Lucene 3.x,可能需要了解這些改變:

  1. 對Field的設計更加合理,使用了列舉來區分Field的具體型別:
    new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS)
  2. IndexWriter中的很多建構函式都被移除了
  3. Search中的很多建構函式都被移除了
  4. QueryParser中的很多建構函式都被移除了
  5. 刪除了Hits類,使用collector去獲取Hits
  6. 索引優化,使Lucene可能近實時。

從Lucene 3.x 升級到Lucene 4.x

Lucene 於2012年10月釋出了Lucene 4.0,該版本重構了Lucene,基本是Lucene劃時代的產品。直接升級需要改動特別多程式碼,在實際操作中一般是直接使用新版本Lucene 4,只遷移資料。

  1. 對Field的設計更加合理,拆分了Field的各種功能:
    StringField:不分詞、被索引。
    TextField:分詞、被索引。
    StoredField:不被索引,當然也不被分詞。
  2. 擴充套件了打分演算法:
    org.apache.lucene.search.DefaultSimilarity擴充套件到了
    org.apache.lucene.search.similarities.*
    1. 通過編碼器Codec機制使得Lucene索引格式與Lucene架構解耦。
    2. 增加了模組化API,以模組化方式提供了非結構化資訊管理分析器和空間資訊搜尋模組。

從Lucene 4.x 升級到Lucene 5.x

Lucene 於2015年2月釋出了Lucene 5.0,從Lucene 5開始,Lucene 開始考慮向前相容。

  1. 所有檔案的訪問方法都已基於Java NIO2
  2. Lucene已實現了為每個segment和每次提交都儲存了唯一的id,從而使得Lucene能夠更加精確地實現索引檔案的複製
  3. 在索引合併的過程中,IndexWriter總會在合併前檢測已經損壞的segment,這就意味著當升級到5.0版本時,對4.X系列的索引進行合併時,會有一定的延遲