2012-07-22 137 views
1

我知道,当Solr执行优化时,无论是明确的优化命令,还是隐式的由于mergeFactor的Lucene,读者都不会被阻止。也就是说,服务器仍可用于搜索solr优化命令和并发性

它是否也可用于更新?我的应用程序中的其他线程能否将文档更新发送到solr,并且还可能发送提交?这些更新会传入索引,还是会被阻止?

回答

1

虽然老问题,但是,一些更多的信息可以在这里帮助。

solr中的优化命令是对IndexWriter的forceMerge()方法的调用。此方法确实会对IndexWriter实例本身进行锁定。然而,重点在于添加文档不需要对IW实例进行任何锁定,也不需要任何commitLock或fullFlushLock。 此外,即使使用forceMerge(),它也是ConcurrentMergeScheduler,它会拾取合并过程,并在不同的线程中完成合并过程。

通常合并过程(不是推荐的forceMerge)只需要在准备合并信息的时候锁定IndexWriter实例,当它需要知道要合并的分段以及新的合并分段名称等。一旦它具有此信息,合并就会同时发生。

所以,是的,即使正在进行优化,您也可以继续添加文档 - 它们将缓存在RAM中,直到IndexWriter的下一次提交/优化或关闭()。尽管如此,不妨添加一下,你不能对不同的段进行并发提交 - 也就是说Lucene一次只能执行一次提交。添加文档不会将其刷新到任何段 - 只需将它们放入缓冲区即可。

0

答案是“是”。服务器将响应搜索请求,但在发送commit命令之前,更新的文档不会显示在搜索结果中。只要客户端/线程向服务器发出commit命令,更新的文档就会堆叠起来并提交。如果您有多个客户端/线程发行updatescommits,它们将不会彼此阻塞,并且只要commit命令完成就会显示更新。