保证Solr Commit已经发生

时间:2016-10-12 08:20:52

标签: java hadoop solr lucene

我有一个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)也无济于事。这是提交窗口的十倍,所以我当然应该保证看到文档吗?

如何保证所有文件都可以搜索?

2 个答案:

答案 0 :(得分:1)

您使用的是SolrCloud还是Master / Slave配置?如果你有主奴隶,那么commitWithin可能无法正常工作。见here

  

commitWithin设置允许强制文档提交发生   定义的时间段。这最常用于近真实   时间搜索,因此默认是执行软   承诺。但是,这不会将新文档复制到slave   主/从环境中的服务器。如果这是一个要求   你的实现,你可以通过添加一个强制提交   参数,如下例所示:

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

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

CommitWithin发出一个软件委托,开启一个新的搜索者。你有可能每100毫秒发布一次提交,但是开放一个新的搜索者需要更长的时间。

尝试将commitWithin增加为500ms1000ms,看看是否有效。

答案 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中进行显式注册。