java - 保证 Solr 提交已经发生

标签 java hadoop solr lucene

我有一个使用 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 增加到 500ms1000ms,看看是否可行。

关于java - 保证 Solr 提交已经发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39993784/

相关文章:

java - 使用函数调用 Java SOURCE

hadoop - 在Hadoop文件系统上执行更新的最佳方法是什么?

java - 多个目录作为 hadoop map reduce 中的输入格式

Solr 9 – 错误 "No suggester named suggest was configured"

solr - 现有 SOLR 集合未获取 Zookeeper 架构更改

apache - 如何计算 Apache SOLR 中 PER DOCUMENT 一词的每次出现次数?

java - 数组[++变量]代表什么?

java - Eclipse 找不到库类

java - 按菜单项标题对 Smartgwt 菜单进行排序

hadoop - 在 Oozie 中将作业调度为文件触发器