List of usage examples for org.apache.lucene.facet FacetsCollector searchAfter
public static TopDocs searchAfter(IndexSearcher searcher, ScoreDoc after, Query q, int n, Sort sort, Collector fc) throws IOException
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; } } }