Solr facet.missing
функциональность выполняется без каких-либо сборщиков, просто сделав это:
SchemaField sf = searcher.getSchema().getField(fieldName);
DocSet hasVal = searcher.getDocSet(sf.getType().getRangeQuery(null, sf, null, null, false, false));
return docs.andNotSize(hasVal);
, что в основном означает - используйте набор документов, предоставленный ранее при поиске, получите другой набор документов, запустив запрос диапазона, который находит только документы с пропущенными значениями, а затем применяет простую логическую операцию.
К сожалению, Lucene не имеет встроенной функциональности DocSet, поэтому потребуются некоторые хитрости. Я мог бы придумать что-то вроде этого:
Query q = some Lucene query
Set<Integer> queryRes = new HashSet<>();
searcher.search(q, new CheckHits.SetCollector(queryRes));
Set<Integer> missingRes = new HashSet<>();
searcher.search(new TermRangeQuery("category", null, null, false, false), new CheckHits.SetCollector(missingRes));
missingRes.retainAll(queryRes);
System.out.println(missingRes.size());
Функциональность сохранения HashSet должна быть довольно хорошей с точки зрения скорости. При необходимости этот коллектор может быть расширен для хранения идентификаторов где-то более эффективным способом
Полный пример можно найти там