1. 程式人生 > >21、學習Lucene3.5索引之近實時搜尋常用工具類

21、學習Lucene3.5索引之近實時搜尋常用工具類

public class LuceneContext {
    /**
     *     將該類設定成單例模式,向外只開放輕量級的介面(諸如:IndexSearcher),
     * 重量級的變數(諸如:NRTManager、SearcherManager)全部設成私有訪問許可權.
     */
private static LuceneContext luceneContext;

    private static final String PATH = "e:/lucene/index03";
    private static Analyzer analyzer;
    private static 
Directory directory; private static IndexWriter indexWriter; private static Version version; private static NRTManager nrtManager; private static SearcherManager searcherManager; private LuceneContext(){ } public static LuceneContext getInstance(){ if (luceneContext
== null){ init(); luceneContext = new LuceneContext(); } return luceneContext; } private static void init(){ try { directory = FSDirectory.open(new File(PATH)); version = Version.LUCENE_35; analyzer = new MMSegAnalyzer
(); indexWriter = new IndexWriter(directory, new IndexWriterConfig(version, analyzer)); nrtManager = new NRTManager(indexWriter, Executors.newCachedThreadPool(), new SearcherWarmer() { @Override public void warm(IndexSearcher s) throws IOException { System.out.println("reopen index"); } }); searcherManager = nrtManager.getSearcherManager(true); NRTManagerReopenThread reopenThread = new NRTManagerReopenThread(nrtManager, 5.0, 0.025); //設定為後臺程序,程序退出,該執行緒就關閉 reopenThread.setDaemon(true); reopenThread.setName("NRTManagerReopenThread"); reopenThread.start(); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取IndexSearcher */ public IndexSearcher getIndexSearcher(){ return searcherManager.acquire(); } /** * 釋放IndexSearcher */ public void releaseIndexSearcher(IndexSearcher indexSearcher){ try { if (indexSearcher != null){ searcherManager.release(indexSearcher); } } catch (IOException e) { e.printStackTrace(); } } /** * 提交更新後的索引 */ public void commitIndex(){ try { indexWriter.commit(); } catch (IOException e) { e.printStackTrace(); } } /** * 獲取NRTManager(對索引的增刪改查需要用到NRTManager) */ public NRTManager getNRTManager(){ return nrtManager; } }