2015-04-16 1 views
0

То, что я хочу сделать, это именно так: Solr: How to perform a batch request to an external system from a PostFilter?Batch сбора в Solr постфильтр

и подход, который я взял похож:

-Ны вызова super.collect (DocId) в сборном метод постфильтра, но хранить все docIds во внутренней карте

-Call внешней системы в отделке() затем вызвать super.collect (DocId) для всех документов, которые проходят фильтрацию внешнего

проблемы я имеют: docId превышает maxDoc «(DocId должно быть> = 0 и < maxDoc = 100000 (получил DocId = 123456)»

Я подозреваю, что я храню местных docIds и когда читатель изменяется, docBase также изменяется таким образом, глобальный DocId, который я Построение построено в super.collect (docId) с использованием параметров docId и docBase, становится неправильным. Я попытался сохранить super.delegate.getLeafCollector (контекст) вместе с docId и вызвать super.delegate.getLeafCollector (context) .collect() вместо super.collect(), но это тоже не сработает (получилось исключение из null-указателя)

ответ

1

Посмотрите на код CollapsingQParserPlugin в кодовой базе Solr, в частности CollapsingScoreCollector.finish.

DocId, который вы получаете в вызове сбора, не уникален во всем мире. Коллекционер Collapsing делает их уникальными, добавляя docBase из контекста в локальный docId для создания globalDoc во время фазы collect().

Затем на этапе finish() вы должны найти контекст, содержащий рассматриваемый документ, и установить reader/leafDelegate в зависимости от того, какую версию Solr вы используете. Указание правильного docId с неправильным контекстом вызовет исключения. Для Collapsing collector вы перебираете контексты, пока не найдете первую docBase меньшей, чем globalDoc.

Наконец, если вы добавили docBase в collect(), не забудьте вычесть docBase в finish(), когда вы вызываете collect() в соответствующем объекте DelegationCollector, поскольку автор мог или не мог сделать это в первый раз ,