保证solr提交已经发生

xa9qqrwz  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(389)

我有一个java工作,它使用solrcloud将文档写入solr。将输入数据转换为不同实体的Map,然后将每个实体写入与其实体类型对应的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) 在检索文档之前没有帮助。这是提交窗口的十倍,所以我肯定应该保证看到文档?
我如何保证所有文档都是可搜索的?

2admgd59

2admgd591#

您可以使用mbean请求处理程序(/admin/mbeans)检查未提交文档的数量。此处理程序提供对管理ui的plugin/stats页上提供的信息的编程访问。
使用参数 stats=true 获取stats属性并检查“updatehandler”类别中的docexpanding(待提交的文档数)。可以使用param按类别名称限制结果 cat=UPDATEHANDLER 但是,无法通过查询(afaik)直接访问docexpensing。
查询示例: https://host.example.com/solr/collectionName/admin/mbeans?wt=json&indent=true&stats=true “/admin/”处理程序从solr 5.0.0开始隐式注册,以前的版本需要在solrconfig.xml中显式注册。

kt06eoxx

kt06eoxx2#

您使用的是solrcloud还是主/从配置?如果你有主从,那么commitwithin可能不起作用。看这里。
commitwithin设置允许强制文档在定义的时间段内提交。这在近实时搜索中最常用,因此默认情况下执行软提交。但是,这不会将新文档复制到主/从环境中的从服务器。如果这是实现的要求,可以通过添加参数强制硬提交,如下例所示:
如果没有,你能直接试试吗 commit() 从你的代码,看看这是否有效?
您还可以检查solr日志以查看提交的频率。如果那些罪犯 openSearcher=true 这意味着每次提交都会打开一个新的搜索程序。如果您正在批量编制索引,将此作为 false . CommitWithin 发布一个软提交,打开一个新的搜索程序。有可能您每100毫秒发布一次提交,但是打开一个新的搜索程序所花费的时间要比这个长。
试着增加你的 commitWithin500ms 或者 1000ms 看看这样行不行。

相关问题