我有一个Java工作,使用SolrCloud将文档写入Solr。将输入数据转换为不同实体的映射,然后将每个实体写入与其实体类型对应的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)
也无济于事。这是提交窗口的十倍,所以我当然应该保证看到文档吗?
如何保证所有文件都可以搜索?
答案 0 :(得分:1)
您使用的是SolrCloud还是Master / Slave配置?如果你有主奴隶,那么commitWithin可能无法正常工作。见here。
commitWithin设置允许强制文档提交发生 定义的时间段。这最常用于近真实 时间搜索,因此默认是执行软 承诺。但是,这不会将新文档复制到slave 主/从环境中的服务器。如果这是一个要求 你的实现,你可以通过添加一个强制提交 参数,如下例所示:
如果没有,您可以尝试从代码中直接commit()
,看看是否有效吗?
您还可以检查solr日志以查看您的提交发生的频率。如果这些提交有openSearcher=true
,则意味着每次提交都会打开一个新的搜索者。如果您批量编制索引,则可能会将其保留为false
。
CommitWithin
发出一个软件委托,开启一个新的搜索者。你有可能每100毫秒发布一次提交,但是开放一个新的搜索者需要更长的时间。
尝试将commitWithin
增加为500ms
或1000ms
,看看是否有效。
答案 1 :(得分:0)
您可以使用MBean Request Handler( / admin / mbeans )查看未提交的文档数。此处理程序提供对Admin UI的Plugin / Stats页面上提供的信息的编程访问。
使用参数stats=true
获取统计信息属性,并在“UPDATEHANDLER”类别中检查 docsPending (待提交的文档数)。您可以使用参数cat=UPDATEHANDLER
按类别名称限制结果,但是无法通过查询(afaik)直接访问docsPending。
示例查询:
https://host.example.com/solr/collectionName/admin/mbeans?wt=json&indent=true&stats=true
“ / admin / ”处理程序从Solr 5.0.0开始隐式注册,以前的版本需要在solrconfig.xml中进行显式注册。