Lucene.NET只读IndexSearcher

时间:2009-08-28 18:28:38

标签: lucene.net

如何使用IndexSearcher以便它不会锁定索引并以只读模式打开它?

现在我只是

var searcher = new IndexSearcher(LuceneIndexPath);

我一直在阅读以只读模式打开提升性能,所以我想知道如何去做。我找不到关于这个主题的大量文档。

2 个答案:

答案 0 :(得分:11)

如果这就是你所拥有的,那么你应该在以后担心性能。在您诉诸索引权限之前,这里有一些提示让您使用Lucene的提示:

  • Lucene 数据库; 它是一个索引。除非索引之外的所有字段都以非常有效的方式最小化。进行搜索时,查询也会被最小化,以便匹配数据的这些唯一哈希值。您要存储的任何内容都不应该用于从数据库中恢复信息。这可以将索引大小(以及搜索速度)降低一个数量级。
  • 干一切 - 使用somethign甚至与Porter Stemmer一样简单,以减少文本中单词的长度。在进行查询时,也要进行查询。虽然这对索引的大小和查询速度影响很小,但这也会提高搜索的稳健性,这同样重要。
  • 停用词?谁需要他们?严重的是,找到一个很好的停用词列表,并将其从您计划编制索引的任何字段中删除。您在任何英文文本中找到的最常用术语在信息检索方面绝对毫无价值。话虽这么说,如果你存储它们,你的数据库可能非常不必要。想象一下,漫步在人行道上写的同样大小的字母。与“好,坏,丑”相比,“好,坏,丑”需要多长时间?

确保首先解决这三个主要方面,您可能不需要担心性能问题。在解决这些问题之前担心性能将是众所周知的邪恶的“过早优化”之一。

答案 1 :(得分:4)

我最近读到了这一点,并想出了这样一种方式,以一种只读的方式使用索引搜索器,让读者在最短的时间内打开:

    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);
});