gpt4 book ai didi

.net - Lucene.NET 中的并发。

转载 作者:行者123 更新时间:2023-12-02 03:45:29 25 4
gpt4 key购买 nike

我想使用 Lucene.NET 在两个应用程序之间共享全文搜索:一个是 ASP.NET MVC 应用程序,另一个是控制台应用程序。这两个应用程序都应该搜索和更新索引。
应该如何处理并发?
我找到了一个 tutorial on ifdefined.com 其中讨论了类似的用例。我担心的是锁定将成为一个很大的瓶颈。

PS:
我还注意到 IndexSearcher 使用索引的快照,并且在上面提到的教程中搜索器仅在索引更新时创建。这是一个好方法吗?我可以在每次搜索时创建一个常规搜索器对象,如果是,开销是多少?

我发现了一个相关问题 Does Lucene.Net manage multiple threads accessing the same index, one indexing while the other is searching?什么声称进程间并发是安全的。这是否意味着索引没有竞争条件?

也是非常重要的一个方面。如果假设有 10-15 个线程试图通过获取 this solution 中提供的共享锁来更新 Lucene 索引,那么性能受到的影响是什么? ?

使用它几个月后,我必须添加搜索的打开索引,如果查询使用排序,通常会在高 CPU 和内存负载下创建 OutOfMemory 异常。索引打开操作的成本很小(以我的经验),但 GC 的成本可能相当高。

最佳答案

首先,我们必须定义一个“写”操作。一旦您开始写操作,写操作将对象锁定,并将持续到您关闭正在执行工作的对象。例如创建一个 IndexWriter 并索引一个文档将导致写入对象锁定,并且它将保持此锁定直到您关闭 IndexWriter。

现在我们可以稍微谈谈锁。这个对象锁是一个基于文件的锁。就像前面提到的 mythz 一样,创建了一个名为“write.lock”的文件。一旦写锁被反对,它就是排他的!此锁导致所有索引修改操作(IndexWriter 和来自 IndexReader 的一些方法)等待,直到锁被移除。

总的来说,你对一个索引有多次读取。您甚至可以同时读写,没问题。但是当有多个作者时就会出现问题。如果一个线程等待锁的时间过长,它将超时。

1) 可能的解决方案 #1 直接操作

如果您确定您的索引操作既短又快,您也许可以同时使用相同的索引。否则,您将不得不考虑如何组织应用程序的索引操作。

2) 可能的解决方案 #2 Web 服务

由于您正在使用 Web 解决方案,因此可能可以创建 Web 服务。在实现此 Web 服务时,我会专门使用一个工作线程进行索引。我会创建一个工作队列来包含工作,如果队列包含多个要完成的工作,它应该将它们全部抓取并批量处理。这将解决所有问题。

3)创建另一个索引,然后合并

如果控制台应用程序在索引上做了繁重的工作,您可以考虑使用控制台应用程序,您可以在控制台应用程序中创建一个单独的索引,然后使用 IndexWriter.AddIndexes 在某个安全的预定时间合并索引。

从这里您可以通过两种方式执行此操作,您可以与直接索引合并。或者你可以合并创建第三个索引,然后当这个索引准备好时替换原来的索引。你在这里所做的也必须小心,以确保你不会锁定大量使用的东西并导致其他写入操作超时。

4)索引和搜索多个索引

我个人认为人们需要将他们的索引分开。这有助于分离程序的职责并最大限度地减少停机时间并保持所有索引的单一点。例如,如果您的控制台应用程序仅负责添加某些字段,或者您正在扩展索引,则您可以将索引分开,但通过在每个文档中使用 ID 字段来维护身份。现在,您可以利用内置支持使用 MultiSercher 类搜索多个索引。或者,如果您想要,还有一个很好的 ParallelMultiSearch 类可以同时搜索两个索引。

5)调查SOLR

其他可以帮助您为索引维护单一位置的问题,您可以更改您的程序以使用 SOLR 服务器。 http://lucene.apache.org/solr/还有一个不错的 SOLRNET http://code.google.com/p/solrnet/在这种情况下可以提供帮助的库。虽然我对 solr 没有经验,但我的印象是它可以帮助您管理这样的情况。它还具有其他好处,例如通过查找项目“MoreLikeThis”或提供拼写检查来突出显示和搜索相关项目。

我确定还有其他方法,但这些都是我能想到的方法。总的来说,您的解决方案取决于有多少人在写作以及您需要的搜索索引的最新程度。总体而言,如果您可以将某些操作推迟到稍后的时间并在任何情况下执行一些批处理操作,则将为您提供最佳性能。我的建议是了解您的工作能力并从那里开始。祝你好运

关于.net - Lucene.NET 中的并发。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2263141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com