1. 程式人生 > >lucene不同版本的差別與比較

lucene不同版本的差別與比較

        將以前開發的專案中的lucene從1.4.3升級到2.1,發現編譯就不通過,於是對照新的API將程式做了修改,目前本人遇到的API更改有

1. IndexReader類

    delete(int id)方法改名為deleteDocuemnt(int id), delete(Term t) 方法改名為deleteDocuments(Term t);

   getFieldNames()方法現在必須傳入引數了,型別是IndexReader.FieldOption,例如

    Collection c=reader.getFieldNames(IndexReader.FieldOption.ALL);

2. Field類

  建構函式Field(String name,String value,boolean store,boolean index,....)不復存在,變成了更加

 相應的Field.Keyword靜態方法也沒有了,必須採用建構函式直接生成例項;

3. BooleanQuery

   add方法也改了,原有的是add(Query q, boolean required, boolean prohibited)現在也更加面向物件了:

    add(Query q, BooleanClause.Occur occur);

4.BooleanClause

  其query屬性不是public的了,需要使用getQuery()方法獲取;

4. IndexWriter

  mergeFactor屬性不再是public的了,有了個setMergeFactor()方法;

5. DateField

  deprecated了,使用DateTools;

6.QueryParser

  parse方法不再是static的了,也就是要先取得QueryParser 的例項再呼叫例項的parse()方法。這樣就可以繼承QueryParser 寫一個自己的檢索式解析器了。我寫了一個來解決做模糊檢索時出現TooManyClauses 異常的問題。主要是利用Filter的機制來實現。但實際執行過程中只能解決PrefixQuery的問題,即title:comput*樣式的檢索式沒有問題(星號在最後),而在做WildcardQuery時即檢索式樣式是title:com*er時速度非常慢(資料量4000萬),於是只好在新的解析器中只重寫了getPrefixQuery()方法。

7. Luke

Luke工具讀2.0的索引不太好用了,在其官方網站上還沒有支援2.0的版本,於是下了原始碼針對2.0的介面重新編譯了一下,做了一些修改。可以從這裡下載:

2.0以前的版本
    Keyword: Field的值將被儲存到索引檔案,為Field的值建立索引,建立索引時不需要分詞。
    UnIndexed: Field的值將被儲存到索引檔案,不為Field的值建立索引,因此不能通過該Field搜尋文件。
    UnStored: Field的值不被儲存到索引檔案,將Field的值分詞後建立索引
   Text: Field的值分詞後建立索引。如果引數為String值將被儲存,為Reader值不被儲存


2.0版本
         用幾個內部類的組合來區分Field的具體型別。
Store 
        COMPRESS:壓縮儲存。用於長文字或二進位制資料          YES:儲存                           NO:不儲存
Index
        NO:不建索引        TOKENIZED:分詞,建索引        UN_TOKENIZED:不分詞,建索引        NO_NORMS:不分詞,建索引。但是Field的值不像通常那樣被儲存,而是隻取一個byte,這樣節約儲存空間
TermVector
        NO:不儲存term vectors        YES:儲存term vectors。        WITH_POSITIONS:儲存term vectors。(儲存值和token位置資訊)        WITH_OFFSETS:儲存term vectors。(儲存值和Token的offset)WITH_POSITIONS_OFFSETS:儲存term vectors。(儲存值和token位置資訊和Token的offset)