我知道当 Solr 执行优化时,无论是通过优化命令显式执行,还是由于 mergeFactor 由 Lucene 隐式执行,读取器都不会被阻塞。也就是说,服务器仍然可以搜索
它也可用于更新吗?我的应用程序中的其他线程可以将文档更新发送到 solr,并且可能还发送提交吗?这些更新会传递到索引中,还是会被阻止?
我知道当 Solr 执行优化时,无论是通过优化命令显式执行,还是由于 mergeFactor 由 Lucene 隐式执行,读取器都不会被阻塞。也就是说,服务器仍然可以搜索
它也可用于更新吗?我的应用程序中的其他线程可以将文档更新发送到 solr,并且可能还发送提交吗?这些更新会传递到索引中,还是会被阻止?
但是,这是一个老问题,更多信息可以在这里提供帮助。
solr 中的优化命令是对 IndexWriter 的 forceMerge() 方法的调用。此方法确实对 IndexWriter 实例本身进行了锁定。但是,重点是添加文档不需要对 IW 实例进行任何锁定,也不需要任何 commitLock 或 fullFlushLock。此外,即使使用 forceMerge(),它也是 ConcurrentMergeScheduler 拾取合并过程并完全在不同的线程中执行。
通常合并过程(不是forceMerge,反正不推荐)只需要在准备合并信息时锁定IndexWriter实例,当它需要知道要合并哪些段,以及新的合并段名称是什么等。一次它有这个信息,合并同时发生。
所以,是的,即使在优化过程中,您也可以继续添加文档——它们将在 RAM 中缓冲,直到 IndexWriter 的下一次提交/优化或 close()。
话虽如此,还不如补充一点,您不能对不同的段进行并发提交 - 也就是说 Lucene 一次只会执行一次提交。添加文档根本不会将它们刷新到任何段 - 只是将它们放在缓冲区中。
答案是“是”。commit
服务器将响应搜索请求,但在您发送命令之前,更新的文档不会显示在搜索结果中。每当客户端/线程向服务器发出commit
命令时,更新的文档就会堆积起来并提交。如果您有多个客户端/线程发出updates
并且commits
它们不会相互阻塞,并且commit
命令完成后将立即显示更新。