Index: src/main/src/org/compass/core/lucene/util/LuceneHelper.java =================================================================== --- src/main/src/org/compass/core/lucene/util/LuceneHelper.java (revision 3896) +++ src/main/src/org/compass/core/lucene/util/LuceneHelper.java (working copy) @@ -24,6 +24,7 @@ import org.apache.lucene.index.TermEnum; import org.apache.lucene.index.TermFreqVector; import org.apache.lucene.search.Filter; +import org.apache.lucene.search.HitCollector; import org.apache.lucene.search.Query; import org.apache.lucene.store.Directory; import org.compass.core.Compass; @@ -265,4 +266,36 @@ } return list.toArray(new String[list.size()]); } + + /** + * Collect results using a {@link HitCollector}. + * + * While using HitCollectors make sure that + * + * + * @param query + * @param hitCollector + * @return the LuceneSearchEngineInternalSearch that was used or null if no index was available + */ + public static LuceneSearchEngineInternalSearch collect(CompassQuery query, HitCollector hitCollector) { + DefaultCompassQuery defaultQuery = ((DefaultCompassQuery) query); + LuceneSearchEngineQuery luceneQuery = getLuceneSearchEngineQuery(query); + LuceneSearchEngineInternalSearch internalSearch = getLuceneInternalSearch(defaultQuery.getSession(), luceneQuery.getSubIndexes(), luceneQuery.getAliases()); + + try { + if (internalSearch.getSearcher() == null) { + // no index + return null; + } + internalSearch.getSearcher().search(luceneQuery.getQuery(), luceneQuery.getFilter().getFilter(), hitCollector); + return internalSearch; + } catch (IOException e) { + throw new SearchEngineException("Failed to collect hits for query [" + query + "]", e); + } + } + + }