Example usage for org.apache.lucene.facet FacetsCollector searchAfter

List of usage examples for org.apache.lucene.facet FacetsCollector searchAfter

Introduction

In this page you can find the example usage for org.apache.lucene.facet FacetsCollector searchAfter.

Prototype

public static TopDocs searchAfter(IndexSearcher searcher, ScoreDoc after, Query q, int n, Sort sort,
        Collector fc) throws IOException 

Source Link

Document

Utility method, to search and also collect all hits into the provided Collector .

Usage

From source file:com.tripod.lucene.service.AbstractLuceneService.java

License:Apache License

/**
 * Common logic for sub-classes to perform searches.
 *
 * @param query the query/*  w  ww.  j a  va  2 s . c  om*/
 * @return the QueryResults
 * @throws QueryException if an error occurred performing the search
 */
protected LuceneQueryResults<QR> performSearch(Q query) throws QueryException {
    IndexSearcher searcher = null;
    try {
        // Acquire an IndexSearcher
        searcher = searcherManager.acquire();

        // Start the results builder with the offset and rows from the query
        final LuceneQueryResults.Builder<QR> resultsBuilder = new LuceneQueryResults.Builder<QR>()
                .pageSize(query.getRows());

        // Create a searcher and get a Lucene query
        final Query luceneQuery = queryTransformer.transform(query);

        // Get the return fields
        final Set<String> fieldsToLoad = new HashSet<>();
        if (query.getReturnFields() != null) {
            query.getReturnFields().stream().forEach(f -> fieldsToLoad.add(f.getName()));
        }

        // Get the facet fields
        final Set<String> facetFields = new HashSet<>();
        if (query.getFacetFields() != null) {
            query.getFacetFields().stream().forEach(f -> facetFields.add(f.getName()));
        }

        final Sort sort = getSort(query.getSorts());
        final Highlighter highlighter = getHighlighter(query, luceneQuery);

        // Collector to use when faceting
        final FacetsCollector facetsCollector = new FacetsCollector();

        // Collector for sorted/paged results
        final TopFieldCollector topFieldCollector = TopFieldCollector.create(sort, query.getRows(),
                (FieldDoc) query.getAfterDoc(), true, false, false);

        // Wrapped collector depending on whether faceting or not
        final Collector collector = facetFields.isEmpty() ? MultiCollector.wrap(topFieldCollector)
                : MultiCollector.wrap(topFieldCollector, facetsCollector);

        // Perform the Lucene query
        final long startTime = System.currentTimeMillis();
        FacetsCollector.searchAfter(searcher, query.getAfterDoc(), luceneQuery, query.getRows(), sort,
                collector);
        LOGGER.debug("Query executed in " + (System.currentTimeMillis() - startTime));

        // Transform each Lucene Document to a QueryResult
        ScoreDoc afterDoc = null;
        for (ScoreDoc scoreDoc : topFieldCollector.topDocs().scoreDocs) {
            final Document doc = getDoc(searcher, scoreDoc.doc, fieldsToLoad);
            final QR result = documentTransformer.transform(doc);
            performHighlighting(searcher, query, scoreDoc, doc, highlighter, result);

            resultsBuilder.addResult(result);
            afterDoc = scoreDoc;
        }

        // Get faceting results
        processFacetResults(searcher, facetsCollector, facetFields, resultsBuilder);

        // Store the last ScoreDoc so it can be passed back for the next page
        resultsBuilder.afterDoc(afterDoc);
        resultsBuilder.totalResults(topFieldCollector.getTotalHits());
        return resultsBuilder.build();

    } catch (TransformException e) {
        throw new QueryException("A transform error occurred");
    } catch (IOException | InvalidTokenOffsetsException e) {
        throw new QueryException("Unexpected error occurred performing query", e);
    } finally {
        if (searcher != null) {
            try {
                searcherManager.release(searcher);
            } catch (IOException e) {
                LOGGER.warn("Error releasing IndexSearcher: " + e.getMessage(), e);
            }
            searcher = null;
        }
    }
}