2008-10-11 40 views
15

在ASP.NET中使用Lucene.Net时,我可以想象一个Web请求可以触发对索引的更新,而另一个Web请求正在执行搜索。 Lucene.Net是否构建了管理并发访问的能力,还是我必须管理它,以避免“被其他进程使用”错误?Lucene.Net管理多个线程访问相同的索引,一个索引,而另一个正在搜索?

编辑:阅读文档和实验后,这是我认为我已经了解到:有两个问题,线程安全性和并发性。多线程是“安全的”,因为你不能对索引做任何坏事。但是,这是安全的,只需要一个对象同时锁定索引。第二个对象会出现并抛出异常。因此,您不能让搜索处于打开状态,并希望另一个线程中的作者能够更新索引。如果一个线程忙于更新索引,那么尝试创建一个搜索器将会失败。

此外,搜索者会在打开索引时看到它的索引,因此如果您将它们放在索引中并更新索引,则索引不会看到更新。

我希望我的搜索者看到最新的更新。

我的设计和它似乎工作到目前为止,我的作家和搜索者共享一个锁,以便他们不会失败 - 他们只是等待 - 直到当前写入或搜索完成。

+0

你能解释一下你是如何实现锁的?你使用读写锁还是只使用一个共享锁? – 2010-02-15 11:24:18

+0

一个共享锁。我写了我所做的: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx – 2010-02-15 14:08:43

+0

你在你的问题中说什么是错的:“所以,你可以如果一个线程正在忙于更新索引,那么尝试创建一个搜索器将会失败。“不要让搜索处于打开状态,并希望另一个线程中的作者能够更新索引。 正如其他答案中提到的:“索引编写器或阅读器可以在搜索进行时编辑lucene索引文件”,反之亦然。 – 2013-10-20 01:10:21

回答

2

与管理对索引的并发写入操作不存在问题。我有一个更简单的路径与SOLR,它将我的大部分差异都抽象出来,因为它作为服务器运行。

21

this page

建立索引和搜索,不仅 线程安全的,但过程是安全的。什么 这意味着:

  • 多个索引搜索可以同时读取 Lucene索引文件。
  • 索引作家或读者可以编辑 Lucene索引文件,同时搜索是 正在进行
  • 多个索引作家或 读者可以尝试在同一时间内编辑Lucene的 索引文件(这是 该指数作家重要/ reader 被关闭,所以它会释放 文件锁定)。但是,查询解析器 不是线程安全的,因此使用该索引的每个线程 都应该有自己的 查询解析器。

但该指数作家,是线程安全的 ,这样你就可以当人们正在寻找它更新索引 。 但是,您必须确保 具有开放索引 搜索者的线程关闭它们并打开新的 ,以获取新更新的数据。

3

你可能有问题,如果你的索引线程创建一个新的文件,它会导致一些指数段合并,那么合并后的部分将被删除,新段将被创建。问题在于,索引搜索器在打开时加载了所有的段,这样就会在打开时存在这些段的“指针”。现在,如果索引编写器执行段合并并删除段,则索引搜索器仍然会认为段文件存在,并且会失败,并显示“文件未找到错误”。您真正需要做的是将您的可写索引与可搜索索引分离,使用SOLR或执行与SOLR类似的索引快照复制。我在Windows上使用.NET和Lucene.NET构建了与SOLR非常相似的系统,并使用NTFS硬链接进行高效的快照复制。如果你有兴趣,我可以给你更多的信息。

相关问题