1

LINQ to Lucene 的正确使用模式是Index<T>什么?

它实现IDisposible了,所以我认为将它包装在 using 语句中最有意义:

IEnumerable<MyDocument> documents = null;

using (Index<MyDocument> index = new Index<MyDocument>(new System.IO.DirectoryInfo(IndexRootPath)))
{
    documents = index.Where(d => d.Name.Like("term")).ToList();
}

我偶尔会遇到意外删除磁盘上的索引的情况。如果索引的多个实例同时存在,似乎 100% 的时间会发生。我使用 PLINQ 编写了一个测试以并行运行 2 个搜索,并且 1 个搜索有效,而另一个返回 0 个结果,因为索引已清空。

  • 我应该改用单个静态实例吗?
  • 我应该把它包起来Lazy<T>吗?
  • 当多个用户同时访问静态索引时,我是否会对其他问题敞开心扉?

我还想根据需要定期重新索引,可能使用另一个进程,如 Windows 服务。如果用户在重建索引时搜索,我是否也会遇到问题?

4

1 回答 1

0

代码看起来像Linq-to-Lucene

大多数完全清除 Lucene 索引的情况是新创建的 IndexWriters,create参数设置为 true。问题中的代码不处理索引,因此很难进一步调试。

Lucene.Net 是线程安全的,我希望 linq-to-lucene 也能抑制这种行为。单个静态索引实例会将内容缓存在内存中,但我想您需要自己处理更改的索引重新加载(我不知道 linq-to-lucene 是否为您执行此操作)。

重新索引时使用多个搜索器/阅读器应该没有问题,Lucene 是为支持该场景而构建的。但是,每个目录只能有一个写入器,因此当您的 Windows 服务优化索引时,没有其他进程可以将文档写入索引。

于 2013-05-04T10:11:35.370 回答