Java 保证Solr提交已发生

Java 保证Solr提交已发生,java,hadoop,solr,lucene,Java,Hadoop,Solr,Lucene,我有一份Java工作,使用SolrCloud将文档写入Solr。将输入数据转换为不同实体的映射,然后将每个实体写入与其实体类型对应的Solr集合 我的代码如下所示: public void updateSolrDocumentsToCollection(String collectionName, Collection<SolrInputDocument> documents) { this.solrClient.setDefaultCollection(collection

我有一份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);
}
public void updateSolrDocumentsToCollection(字符串collectionName,集合文档){
this.solrClient.setDefaultCollection(collectionName);
UpdateRequest UpdateRequest=新的UpdateRequest();
updateRequest.add(文档);
updateRequest.setCommitWithin(100);//100ms
updateRequest.process(this.solrClient);
}
对于我正在编写的每个集合,都会调用此方法一次,然后进行最后一次调用,将最后一个文档写入
audit
集合

在集成测试中,我等待从
audit
集合中检索文档,然后从实体集合中检索文档

问题

我假设因为
audit
是最后写入的,一旦我可以从
audit
中检索,那么我就可以从以前写入的任何其他集合中检索。然而,这似乎不是真的。大约有1%的时间会检索审核文档,但测试失败,因为其他集合尚未包含其文档

即使在检索文档之前添加一个
线程.sleep(1000)
,也无济于事。这是提交窗口的十倍,所以我应该保证看到文档吗


如何保证所有文档都是可搜索的?

您可以使用(/admin/mbeans)检查未提交文档的数量。此处理程序提供对管理UI的Plugin/Stats页面上提供的信息的编程访问

使用param
stats=true
获取统计属性,并检查“UPDATEHANDLER”类别中的docexpensing(待提交的文档数)。您可以使用param
cat=UPDATEHANDLER
按类别名称限制结果,但是无法通过查询直接访问DocExpensing(afaik)

查询示例:

https://host.example.com/solr/collectionName/admin/mbeans?wt=json&indent=true&stats=true


“/admin/”处理程序从Solr 5.0.0开始隐式注册,以前的版本需要在solrconfig.xml中显式注册。

您使用的是SolrCloud还是主/从配置?如果您有主从,那么commitWithin可能无法工作。看

commitWithin设置允许在中强制文档提交 确定的时间段。这在接近真实的情况下最常用 时间搜索,出于这个原因,默认情况下是执行软搜索 犯罪但是,这不会将新文档复制到从属文件 主/从环境中的服务器。如果这是你的要求 在您的实现中,您可以通过添加 参数,如本例所示:

如果没有,您是否可以尝试从代码中直接执行
commit()
,看看是否有效

您还可以检查solr日志,查看提交的频率。如果这些提交具有
openSearcher=true
,则意味着每次提交都会打开一个新的搜索程序。如果您正在批量编制索引,那么将其保留为
false
可能会有好处

CommitWithin
发出软提交,打开新的搜索程序。您可能每100毫秒发布一次提交,但打开一个新的搜索程序需要更长的时间


试着增加你的
commitWithin
,说
500ms
1000ms
,看看这是否有效

对不起,我已经澄清了这个问题。