我有一个使用 SolrCloud 将文档写入 Solr 的 Java 作业。输入数据被转换为不同实体的映射,然后将每个实体写入与其实体类型对应的 Solr 集合。
我的代码如下:
public void updateSolrDocumentsToCollection(String collectionName, Collection<SolrInputDocument> documents) {
this.solrClient.setDefaultCollection(collectionName);
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.add(documents);
updateRequest.setCommitWithin(100); //100ms
updateRequest.process(this.solrClient);
}
我正在写入的每个集合都会调用此方法一次,然后进行最后一次调用以将最后一个文档写入 audit
集合。
在集成测试中,我等到可以从 audit
集合中检索文档,然后从实体集合中检索文档。
问题
我假设因为 audit
是写到最后的,一旦我可以从 audit
中检索,我就可以从我之前写入的任何其他集合中检索。然而,这似乎不是真的。大约 1% 的时间会检索到审计文档,但测试会失败,因为其他集合尚未包含它们的文档。
即使在检索文档之前添加一个 Thread.sleep(1000)
也无济于事。那是提交窗口的十倍,所以我肯定能看到文档吗?
我如何保证所有文档都是可搜索的?
最佳答案
您使用的是 SolrCloud 还是主/从配置?如果您有主从,则 commitWithin 可能不起作用。参见 here .
The commitWithin settings allow forcing document commits to happen in a defined time period. This is used most frequently with Near Real Time Searching, and for that reason the default is to perform a soft commit. This does not, however, replicate new documents to slave servers in a master/slave environment. If that's a requirement for your implementation, you can force a hard commit by adding a parameter, as in this example:
如果不行,您可以直接从您的代码中尝试 commit()
看看是否可行吗?
您还可以检查 solr 日志以查看提交的频率。如果这些提交具有 openSearcher=true
,则意味着每次提交都会打开一个新的搜索器。如果您要批量编制索引,将其保留为 false
可能会有所帮助。
CommitWithin
发出打开新搜索器的软提交。您可能每 100 毫秒发出一次提交,但打开一个新的搜索器花费的时间比这更长。
尝试将您的 commitWithin
增加到 500ms
或 1000ms
,看看是否可行。
关于java - 保证 Solr 提交已经发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39993784/