gpt4 book ai didi

java - 保证 Solr 提交已经发生

转载 作者:可可西里 更新时间:2023-11-01 14:52:02 30 4
gpt4 key购买 nike

我有一个使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com