The ChildDocTransformerFactory creates a QueryBitSetProducer every time. These are heavy to compute; they should be cached. BlockJoinParentQParserPlugin does this correctly, using the "perSegFilter" named Solr cache. They should both do the same. To avoid duplication of logic, consider creating a new class named something like PerSegFilterCacheManager, or maybe manage directly on SolrIndexSearcher (alas; SIS is huge).