我有一个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)
在检索文档之前没有帮助。这是提交窗口的十倍,所以我肯定应该保证看到文档?
我如何保证所有文档都是可搜索的?
2条答案
按热度按时间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中显式注册。kt06eoxx2#
您使用的是solrcloud还是主/从配置?如果你有主从,那么commitwithin可能不起作用。看这里。
commitwithin设置允许强制文档在定义的时间段内提交。这在近实时搜索中最常用,因此默认情况下执行软提交。但是,这不会将新文档复制到主/从环境中的从服务器。如果这是实现的要求,可以通过添加参数强制硬提交,如下例所示:
如果没有,你能直接试试吗
commit()
从你的代码,看看这是否有效?您还可以检查solr日志以查看提交的频率。如果那些罪犯
openSearcher=true
这意味着每次提交都会打开一个新的搜索程序。如果您正在批量编制索引,将此作为false
.CommitWithin
发布一个软提交,打开一个新的搜索程序。有可能您每100毫秒发布一次提交,但是打开一个新的搜索程序所花费的时间要比这个长。试着增加你的
commitWithin
说500ms
或者1000ms
看看这样行不行。