我想要做的是这样的: Solr: How to perform a batch request to an external system from a PostFilter?
我采用的方法类似:
- 不要在PostFilter的collect方法中调用super.collect(docId),而是将所有docId存储在内部地图中
- 在finish()中调用外部系统,然后为通过外部过滤的所有文档调用super.collect(docId)
我遇到的问题:docId超过maxDoc“(docID必须是> = 0且< maxDoc = 100000(得到docID = 123456)”
我怀疑我正在存储本地docId,当Reader被更改时,docBase也会被更改,因此我认为使用参数docId和docBase在super.collect(docId)中构造的全局docId变得不正确。我已经尝试将super.delegate.getLeafCollector(context)与docId一起存储并调用super.delegate.getLeafCollector(context).collect()而不是super.collect()但这也不起作用(得到一个空指针异常) )
答案 0 :(得分:1)
查看Solr代码库中CollapsingQParserPlugin的代码,尤其是CollapsingScoreCollector.finish。
您在电话会议中收到的docId并非全球唯一。通过在上下文中将docBase添加到本地docId,Collapsing收集器使它们成为唯一,以在collect()阶段创建globalDoc。
然后在finish()阶段,您必须找到包含相关文档的上下文,并根据您运行的Solr版本设置reader / leafDelegate。使用错误的上下文指定正确的docId将抛出异常。对于Collapsing收集器,您将遍历上下文,直到找到小于globalDoc的第一个docBase。
最后,如果你在collect()中添加了docBase,那么当你在相应的DelegationCollector对象上调用collect()时,不要忘记在finish()中减去docBase,因为作者可能会或可能没有完成第一个时间。