2009-08-28 129 views
1

如何使用IndexSearcher,以便它不鎖定索引並以只讀模式打開它?Lucene.NET只讀IndexSearcher

現在我只是有

var searcher = new IndexSearcher(LuceneIndexPath); 

我一直在讀只讀模式打開提升性能,所以我不知道如何去做。我無法找到關於此主題的大量文檔。

回答

11

如果這就是你的全部,那麼以後應該擔心性能。這裏有幾個技巧,讓你使用Lucene會再打索引權限擺弄前:

  • Lucene是的數據庫;這是一個索引。除非索引以外的所有字段都以非常有效的方式最小化。當進行搜索時,查詢也被最小化,以便它匹配那些數據的唯一哈希值。任何你不存儲被搜索的東西應該是你要用來從 DB恢復信息的東西。這可以將您的索引大小(從而搜索速度)降低一個數量級。
  • 幹所有 -使用somethign簡化爲Porter Stemmer以減少文字中單詞的長度。當你進行查詢時,也要這樣做。雖然這對您的索引大小和查詢速度影響很小,但這同樣會增加您的搜索穩健性,這同樣重要。
  • 停用詞?誰需要他們?嚴肅地說,找到一個不錯的停用詞表並從計劃編制索引的任何字段中刪除它們。在任何英文文本中找到的最常用術語在信息檢索方面都是毫無價值的。話雖如此,如果你存儲它們,你的數據庫可能非常大。想象一下,在人行道上寫下等量的信件。與「好,壞,醜」相比,「好,壞,醜」會持續多久?

確保這三個主要方面首先解決,你可能並不需要擔心性能的不多。在這些問題得到解決之前擔心業績將是那些臭名昭着的「過早優化」之一。

4

我最近看了關於這一點,並用這種方式在只讀方式使用IndexSearcher的留給讀者開放最短的時間內想出了:

private T searchIndex<T>(Func<IndexSearcher, T> searchAction) 
{ 
    var indexReader = IndexReader.Open(_indexDirectory, true); 
    var indexSearcher = new IndexSearcher(indexReader); 

    var result = searchAction(indexSearcher); 

    indexSearcher.Close(); 
    indexReader.Close(); 

    return result; 
} 

耗時代碼看起來是這樣的

var hits = searchIndex(s=> { 
    var query = _queryParser.Parse(searchString); 
    return indexSearcher.Search(query); 
});