在ASP.NET中使用Lucene.Net时,我可以想象一个Web请求可以触发对索引的更新,而另一个Web请求正在执行搜索。 Lucene.Net是否构建了管理并发访问的能力,还是我必须管理它,以避免“被其他进程使用”错误?Lucene.Net管理多个线程访问相同的索引,一个索引,而另一个正在搜索?
编辑:阅读文档和实验后,这是我认为我已经了解到:有两个问题,线程安全性和并发性。多线程是“安全的”,因为你不能对索引做任何坏事。但是,这是安全的,只需要一个对象同时锁定索引。第二个对象会出现并抛出异常。因此,您不能让搜索处于打开状态,并希望另一个线程中的作者能够更新索引。如果一个线程忙于更新索引,那么尝试创建一个搜索器将会失败。
此外,搜索者会在打开索引时看到它的索引,因此如果您将它们放在索引中并更新索引,则索引不会看到更新。
我希望我的搜索者看到最新的更新。
我的设计和它似乎工作到目前为止,我的作家和搜索者共享一个锁,以便他们不会失败 - 他们只是等待 - 直到当前写入或搜索完成。
你能解释一下你是如何实现锁的?你使用读写锁还是只使用一个共享锁? – 2010-02-15 11:24:18
一个共享锁。我写了我所做的: http://ifdefined.com/blog/post/Full-Text-Search-in-ASPNET-using-LuceneNET.aspx – 2010-02-15 14:08:43
你在你的问题中说什么是错的:“所以,你可以如果一个线程正在忙于更新索引,那么尝试创建一个搜索器将会失败。“不要让搜索处于打开状态,并希望另一个线程中的作者能够更新索引。 正如其他答案中提到的:“索引编写器或阅读器可以在搜索进行时编辑lucene索引文件”,反之亦然。 – 2013-10-20 01:10:21