我们有一个名为“server”的CommonsHttpSolrServer变量,我们正在使用格式正确的SolrInputDocument执行server.add(...),其上有几个字段(id和accountNumber)。我们的文档未显示在Solr存储库中。当我们复制Solr演示工具SimplePostTool的源代码(手动格式化HTTP帖子)时,Solr服务器已更新。当我们比较两个帖子之间的差异时,我们发现SimplePostTool代码发送了一个由
组成的后续帖子<commit/>
即使我们有一个server.commit(),在与CommonsHttpSolrServer直接交互时,也不会向我们的Solr服务器发布提交标记。我们也尝试了解决方案 http://www.mail-archive.com/solr-dev@lucene.apache.org/msg12289.html 尝试将提交发布到Solr服务器但仍然没有提交。当我们执行server.add(...)然后运行SimplePostTool时,SimplePostTool提供的提交会成功导致所有挂起的Solr更新被提交。
我们的问题是如何使用CommonsHttpSolrServer强制将提交发布到Solr服务器,而不是将原始HTTP帖子混合在一起。
我们正在使用solr-core 3.1.0
谢谢!
这是有问题的代码,它是通过Spring配置的Groovy代码,如果你愿意,我可以提出不同的样本。
//message queue listener receives an ImagingMessage
class ImagingProcessor {
SolrServer server
void process(ImagingMessage message) {
server.add(DocumentFactory.createDocument(message.indexedFields, message.file))
server.commit()
//also tried http://www.mail-archive.com/solr-dev@lucene.apache.org/msg12289.html
//and varios flavors of .commit(boolean, boolean)
}
}
class ImagingMessage {
List<IndexedField> indexedFields
byte[] file
}
class DocumentFactory {
static SolrInputDocument createDocument(List<IndexedField> indexedFields, byte[] file) {
SolrInputDocument solrInputDocument = new SolrInputDocument()
indexedFields.each {
solrInputDocument.addField it.name, it.value
}
solrInputDocument.addField "content", file
println solrInputDocument.toString()
solrInputDocument
}
}
我们确实有一个基于SimplePostTool运行的解决方案来发布一个标签,而不是使用server.commit(),但这只是一个丑陋的临时黑客。
我们并不真的想要为每条消息提交(正如我们在这里的spike / demo代码中所做的那样),但我们确实需要偶尔提交,例如可能按计划进行,否则我们填写的内容的尾部lucene存储将不可见。