Lucene 4.x 之 IndexReader

在Lucene 3.x時代,《Lucene In Action》是一本至關不錯的參考書,書中詳細介紹了Lucene各類高級使用技術,對於開發者來講很是實用。可是近期Lucene升級到了4.x版本,在性能等各方面有了很大的提升,值得在新項目中使用。然而Lucene 4.x中的API相比3.x來講有了很大的改變,《Lucene In Action》中的不少內容都已通過時了,而且因爲4.x推出的時間不長,尚未比較好的文檔來對用法進行說明,這個系列文章就是想記錄下本身使用Lucene 4.x的經驗體會,供你們參考使用。java

因爲如今網絡搜索都但願達到實時搜索的效果,用戶上傳文章後,但願當即在搜索結果中可見,這就要求咱們必須使用Lucene的準實時搜索功能,使咱們在不影響性能的狀況下達到近實時搜索的效果。然而準實時搜索API在4.x版本中已經與3.x版本徹底不一樣了。web

首先來看怎樣獲取準實時搜索的Reader實例,你們都知道,因爲性能等方面緣由,基於Lucene的應用通常都採用共享Lucene的Writer和Reader及Searcher的方案,咱們這裏也不例外:網絡

indexPathname = "D:/aproject/xincaigu/work/index";
        analyzer = new MMSegAnalyzer();
        IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_41, analyzer);
        iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
        try {
            indexDir = FSDirectory.open(new File(indexPathname)); 
            writer = new IndexWriter(indexDir, iwc);  // writer和reader整個程序共用
            reader = DirectoryReader.open(writer, true);
            //reader = writer.getReader();
        } catch (CorruptIndexException e) {
        } catch (LockObtainFailedException e) {
        } catch (IOException e) {
        }


熟悉Lucene 3.x的朋友必定注意到了,獲取準實時搜索所用的Reader已經改用DirectoryReader.open方法,而不是3.x當中的writer.getReader()方法了。性能

一樣,在3.x中,爲了能夠看到剛剛添加的新文章,Reader須要進行reopen操做,這是一種節省資源的方式,能夠獲取新加入索引的文章,而不須要將改動保存到磁盤上,而後從新打開索引的方式來進行了。可是reopne在4.x也被新API所取代,具體的用法以下所示:spa

try {
            IndexReader newReader = DirectoryReader.openIfChanged((DirectoryReader)reader, writer, false);//reader.reopen();      // 讀入新增長的增量索引內容,知足實時索引需求
            if (newReader != null) {
                reader.close();
                reader = newReader;
            }
            searcher = new IndexSearcher(reader);
        } catch (CorruptIndexException e) {
        } catch (IOException e) {
        }


這裏首先利用新APIDirctoryReader.openIfChanged來獲取Reader,若是有新內容,則返回新的Reader,這時咱們須要關閉老的Reader。code

經過以上代碼,咱們就能夠利用Lucene 4.x的準實時搜索功能了。可是Lucene 4.x中API的變更遠不止這些,在進行索引時,原來定義Field的方式已通過時,取而代之的是更加靈活的FieldType機制,下篇文章中咱們將詳細探討如何在文本索引中使用這一新的機制。orm

相關文章
相關標籤/搜索