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