Example usage for org.apache.lucene.search TopDocsCollector topDocs

List of usage examples for org.apache.lucene.search TopDocsCollector topDocs

Introduction

In this page you can find the example usage for org.apache.lucene.search TopDocsCollector topDocs.

Prototype

public TopDocs topDocs(int start, int howMany) 

Source Link

Document

Returns the documents in the range [start ..

Usage

From source file:org.apache.solr.search.SolrIndexSearcher.java

License:Apache License

private void getDocListNC(QueryResult qr, QueryCommand cmd) throws IOException {
    final long timeAllowed = cmd.getTimeAllowed();
    int len = cmd.getSupersetMaxDoc();
    int last = len;
    if (last < 0 || last > maxDoc())
        last = maxDoc();/*from w w  w.  ja va 2s  .co  m*/
    final int lastDocRequested = last;
    int nDocsReturned;
    int totalHits;
    float maxScore;
    int[] ids;
    float[] scores;

    boolean needScores = (cmd.getFlags() & GET_SCORES) != 0;
    boolean terminateEarly = (cmd.getFlags() & TERMINATE_EARLY) == TERMINATE_EARLY;

    Query query = QueryUtils.makeQueryable(cmd.getQuery());

    ProcessedFilter pf = getProcessedFilter(cmd.getFilter(), cmd.getFilterList());
    final Filter luceneFilter = pf.filter;

    // handle zero case...
    if (lastDocRequested <= 0) {
        final float[] topscore = new float[] { Float.NEGATIVE_INFINITY };
        final int[] numHits = new int[1];

        Collector collector;

        if (!needScores) {
            collector = new Collector() {
                @Override
                public void setScorer(Scorer scorer) {
                }

                @Override
                public void collect(int doc) {
                    numHits[0]++;
                }

                @Override
                public void setNextReader(AtomicReaderContext context) {
                }

                @Override
                public boolean acceptsDocsOutOfOrder() {
                    return true;
                }
            };
        } else {
            collector = new Collector() {
                Scorer scorer;

                @Override
                public void setScorer(Scorer scorer) {
                    this.scorer = scorer;
                }

                @Override
                public void collect(int doc) throws IOException {
                    numHits[0]++;
                    float score = scorer.score();
                    if (score > topscore[0])
                        topscore[0] = score;
                }

                @Override
                public void setNextReader(AtomicReaderContext context) {
                }

                @Override
                public boolean acceptsDocsOutOfOrder() {
                    return true;
                }
            };
        }
        if (terminateEarly) {
            collector = new EarlyTerminatingCollector(collector, cmd.len);
        }
        if (timeAllowed > 0) {
            collector = new TimeLimitingCollector(collector, TimeLimitingCollector.getGlobalCounter(),
                    timeAllowed);
        }
        if (pf.postFilter != null) {
            pf.postFilter.setLastDelegate(collector);
            collector = pf.postFilter;
        }

        try {
            super.search(query, luceneFilter, collector);
            if (collector instanceof DelegatingCollector) {
                ((DelegatingCollector) collector).finish();
            }
        } catch (TimeLimitingCollector.TimeExceededException x) {
            log.warn("Query: " + query + "; " + x.getMessage());
            qr.setPartialResults(true);
        }

        nDocsReturned = 0;
        ids = new int[nDocsReturned];
        scores = new float[nDocsReturned];
        totalHits = numHits[0];
        maxScore = totalHits > 0 ? topscore[0] : 0.0f;
    } else {
        TopDocsCollector topCollector;
        if (cmd.getSort() == null) {
            if (cmd.getScoreDoc() != null) {
                topCollector = TopScoreDocCollector.create(len, cmd.getScoreDoc(), true); //create the Collector with InOrderPagingCollector
            } else {
                topCollector = TopScoreDocCollector.create(len, true);
            }

        } else {
            topCollector = TopFieldCollector.create(weightSort(cmd.getSort()), len, false, needScores,
                    needScores, true);
        }
        Collector collector = topCollector;
        if (terminateEarly) {
            collector = new EarlyTerminatingCollector(collector, cmd.len);
        }
        if (timeAllowed > 0) {
            collector = new TimeLimitingCollector(collector, TimeLimitingCollector.getGlobalCounter(),
                    timeAllowed);
        }
        if (pf.postFilter != null) {
            pf.postFilter.setLastDelegate(collector);
            collector = pf.postFilter;
        }
        try {
            super.search(query, luceneFilter, collector);
            if (collector instanceof DelegatingCollector) {
                ((DelegatingCollector) collector).finish();
            }
        } catch (TimeLimitingCollector.TimeExceededException x) {
            log.warn("Query: " + query + "; " + x.getMessage());
            qr.setPartialResults(true);
        }

        totalHits = topCollector.getTotalHits();
        TopDocs topDocs = topCollector.topDocs(0, len);
        maxScore = totalHits > 0 ? topDocs.getMaxScore() : 0.0f;
        nDocsReturned = topDocs.scoreDocs.length;
        ids = new int[nDocsReturned];
        scores = (cmd.getFlags() & GET_SCORES) != 0 ? new float[nDocsReturned] : null;
        for (int i = 0; i < nDocsReturned; i++) {
            ScoreDoc scoreDoc = topDocs.scoreDocs[i];
            ids[i] = scoreDoc.doc;
            if (scores != null)
                scores[i] = scoreDoc.score;
        }
    }

    int sliceLen = Math.min(lastDocRequested, nDocsReturned);
    if (sliceLen < 0)
        sliceLen = 0;
    qr.setDocList(new DocSlice(0, sliceLen, ids, scores, totalHits, maxScore));
}

From source file:org.apache.solr.search.SolrIndexSearcher.java

License:Apache License

private DocSet getDocListAndSetNC(QueryResult qr, QueryCommand cmd) throws IOException {
    int len = cmd.getSupersetMaxDoc();
    int last = len;
    if (last < 0 || last > maxDoc())
        last = maxDoc();/*from  w w  w.  ja va2  s  . co m*/
    final int lastDocRequested = last;
    int nDocsReturned;
    int totalHits;
    float maxScore;
    int[] ids;
    float[] scores;
    DocSet set;

    boolean needScores = (cmd.getFlags() & GET_SCORES) != 0;
    boolean terminateEarly = (cmd.getFlags() & TERMINATE_EARLY) == TERMINATE_EARLY;
    int maxDoc = maxDoc();
    int smallSetSize = maxDoc >> 6;

    ProcessedFilter pf = getProcessedFilter(cmd.getFilter(), cmd.getFilterList());
    final Filter luceneFilter = pf.filter;

    Query query = QueryUtils.makeQueryable(cmd.getQuery());
    final long timeAllowed = cmd.getTimeAllowed();

    // handle zero case...
    if (lastDocRequested <= 0) {
        final float[] topscore = new float[] { Float.NEGATIVE_INFINITY };

        Collector collector;
        DocSetCollector setCollector;

        if (!needScores) {
            collector = setCollector = new DocSetCollector(smallSetSize, maxDoc);
        } else {
            collector = setCollector = new DocSetDelegateCollector(smallSetSize, maxDoc, new Collector() {
                Scorer scorer;

                @Override
                public void setScorer(Scorer scorer) {
                    this.scorer = scorer;
                }

                @Override
                public void collect(int doc) throws IOException {
                    float score = scorer.score();
                    if (score > topscore[0])
                        topscore[0] = score;
                }

                @Override
                public void setNextReader(AtomicReaderContext context) {
                }

                @Override
                public boolean acceptsDocsOutOfOrder() {
                    return false;
                }
            });
        }
        if (terminateEarly) {
            collector = new EarlyTerminatingCollector(collector, cmd.len);
        }
        if (timeAllowed > 0) {
            collector = new TimeLimitingCollector(collector, TimeLimitingCollector.getGlobalCounter(),
                    timeAllowed);
        }
        if (pf.postFilter != null) {
            pf.postFilter.setLastDelegate(collector);
            collector = pf.postFilter;
        }

        try {
            super.search(query, luceneFilter, collector);
            if (collector instanceof DelegatingCollector) {
                ((DelegatingCollector) collector).finish();
            }
        } catch (TimeLimitingCollector.TimeExceededException x) {
            log.warn("Query: " + query + "; " + x.getMessage());
            qr.setPartialResults(true);
        }

        set = setCollector.getDocSet();

        nDocsReturned = 0;
        ids = new int[nDocsReturned];
        scores = new float[nDocsReturned];
        totalHits = set.size();
        maxScore = totalHits > 0 ? topscore[0] : 0.0f;
    } else {

        TopDocsCollector topCollector;

        if (cmd.getSort() == null) {
            topCollector = TopScoreDocCollector.create(len, true);
        } else {
            topCollector = TopFieldCollector.create(weightSort(cmd.getSort()), len, false, needScores,
                    needScores, true);
        }

        DocSetCollector setCollector = new DocSetDelegateCollector(maxDoc >> 6, maxDoc, topCollector);
        Collector collector = setCollector;
        if (terminateEarly) {
            collector = new EarlyTerminatingCollector(collector, cmd.len);
        }
        if (timeAllowed > 0) {
            collector = new TimeLimitingCollector(collector, TimeLimitingCollector.getGlobalCounter(),
                    timeAllowed);
        }
        if (pf.postFilter != null) {
            pf.postFilter.setLastDelegate(collector);
            collector = pf.postFilter;
        }
        try {
            super.search(query, luceneFilter, collector);
            if (collector instanceof DelegatingCollector) {
                ((DelegatingCollector) collector).finish();
            }
        } catch (TimeLimitingCollector.TimeExceededException x) {
            log.warn("Query: " + query + "; " + x.getMessage());
            qr.setPartialResults(true);
        }

        set = setCollector.getDocSet();

        totalHits = topCollector.getTotalHits();
        assert (totalHits == set.size());

        TopDocs topDocs = topCollector.topDocs(0, len);
        maxScore = totalHits > 0 ? topDocs.getMaxScore() : 0.0f;
        nDocsReturned = topDocs.scoreDocs.length;

        ids = new int[nDocsReturned];
        scores = (cmd.getFlags() & GET_SCORES) != 0 ? new float[nDocsReturned] : null;
        for (int i = 0; i < nDocsReturned; i++) {
            ScoreDoc scoreDoc = topDocs.scoreDocs[i];
            ids[i] = scoreDoc.doc;
            if (scores != null)
                scores[i] = scoreDoc.score;
        }
    }

    int sliceLen = Math.min(lastDocRequested, nDocsReturned);
    if (sliceLen < 0)
        sliceLen = 0;

    qr.setDocList(new DocSlice(0, sliceLen, ids, scores, totalHits, maxScore));
    // TODO: if we collect results before the filter, we just need to intersect with
    // that filter to generate the DocSet for qr.setDocSet()
    qr.setDocSet(set);

    // TODO: currently we don't generate the DocSet for the base query,
    // but the QueryDocSet == CompleteDocSet if filter==null.
    return pf.filter == null && pf.postFilter == null ? qr.getDocSet() : null;
}

From source file:org.apache.solr.search.SolrIndexSearcher.java

License:Apache License

protected DocList sortDocSet(DocSet set, Sort sort, int nDocs) throws IOException {
    if (nDocs == 0) {
        // SOLR-2923
        return new DocSlice(0, 0, new int[0], null, 0, 0f);
    }//w  w w  .  j av a  2 s .  c  o  m

    // bit of a hack to tell if a set is sorted - do it better in the future.
    boolean inOrder = set instanceof BitDocSet || set instanceof SortedIntDocSet;

    TopDocsCollector topCollector = TopFieldCollector.create(weightSort(sort), nDocs, false, false, false,
            inOrder);

    DocIterator iter = set.iterator();
    int base = 0;
    int end = 0;
    int readerIndex = 0;

    while (iter.hasNext()) {
        int doc = iter.nextDoc();
        while (doc >= end) {
            AtomicReaderContext leaf = leafContexts.get(readerIndex++);
            base = leaf.docBase;
            end = base + leaf.reader().maxDoc();
            topCollector.setNextReader(leaf);
            // we should never need to set the scorer given the settings for the collector
        }
        topCollector.collect(doc - base);
    }

    TopDocs topDocs = topCollector.topDocs(0, nDocs);

    int nDocsReturned = topDocs.scoreDocs.length;
    int[] ids = new int[nDocsReturned];

    for (int i = 0; i < nDocsReturned; i++) {
        ScoreDoc scoreDoc = topDocs.scoreDocs[i];
        ids[i] = scoreDoc.doc;
    }

    return new DocSlice(0, nDocsReturned, ids, null, topDocs.totalHits, 0.0f);
}

From source file:org.brutusin.fleadb.pagination.PaginatorImpl.java

License:Apache License

private TopDocs queryDocuments(int pageSize, FieldDoc memento) throws IOException {
    TopDocsCollector documentCollector = TopFieldCollector.create(this.sort, pageSize, memento, true, false,
            false, false);/*from ww w . j a  va 2  s .c o  m*/
    searcher.search(this.q, documentCollector);
    this.totalHits = documentCollector.getTotalHits();
    return documentCollector.topDocs(0, pageSize);
}

From source file:org.eclipse.skalli.core.search.LuceneIndex.java

License:Open Source License

private <R extends SearchResult<T>> R search(final String[] fields, String facetFields[],
        final String queryString, PagingInfo pagingInfo, R ret) throws QueryParseException {
    long start = System.nanoTime();
    List<SearchHit<T>> resultList = new LinkedList<SearchHit<T>>();
    int totalHitCount = 0;
    if (pagingInfo == null) {
        pagingInfo = new PagingInfo(0, 10);
    }/*from  ww w  . j  av  a  2  s .c  om*/
    if (StringUtils.equals("*", queryString) || StringUtils.isEmpty(queryString)) { //$NON-NLS-1$
        List<T> allEntities = entityService.getAll();
        List<T> sublist = allEntities.subList(Math.min(pagingInfo.getStart(), allEntities.size()),
                Math.min(pagingInfo.getStart() + pagingInfo.getCount(), allEntities.size()));
        resultList.addAll(entitiesToHit(sublist));
        totalHitCount = allEntities.size();
    } else if (initialized) {
        List<String> fieldList = Arrays.asList(fields);
        IndexReader reader = null;
        IndexSearcher searcher = null;
        try {
            reader = IndexReader.open(directory);
            searcher = new IndexSearcher(reader);
            QueryParser parser = new MultiFieldQueryParser(LUCENE_VERSION, fields, analyzer);
            Query query = getQuery(parser, queryString);

            // it is not possible that we have more hits than projects!
            int maxHits = entityService.size();
            int numHits = pagingInfo.getStart() + pagingInfo.getCount();
            if (numHits < 0 || numHits > maxHits) {
                numHits = maxHits;
            }
            if (numHits > 0) {
                TopDocsCollector<ScoreDoc> collector;
                if (facetFields == null) {
                    collector = TopScoreDocCollector.create(numHits, false);
                } else {
                    collector = new FacetedCollector(facetFields, searcher.getIndexReader(), numHits);
                }

                searcher.search(query, collector);
                Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query));
                TopDocs topDocs = collector.topDocs(pagingInfo.getStart(), pagingInfo.getCount());
                for (ScoreDoc hit : topDocs.scoreDocs) {
                    Document doc = searcher.doc(hit.doc);
                    SearchHit<T> searchHit = getSearchHit(doc, fieldList, hit.score, highlighter);
                    resultList.add(searchHit);
                }

                totalHitCount = collector.getTotalHits();
                if (collector instanceof FacetedCollector && ret instanceof FacetedSearchResult) {
                    ((FacetedSearchResult<T>) ret).setFacetInfo(((FacetedCollector) collector).getFacetsMap());
                }
            }
        } catch (Exception e) {
            LOG.error(MessageFormat.format("Searching with query ''{0}'' failed", queryString), e);
        } finally {
            closeQuietly(searcher);
            closeQuietly(reader);
        }
    }

    long nanoDuration = System.nanoTime() - start;
    long milliDuration = Math.round(nanoDuration / 1000000d);
    ret.setPagingInfo(pagingInfo);
    ret.setQueryString(queryString);
    ret.setResultCount(totalHitCount);
    ret.setResult(resultList);
    ret.setDuration(milliDuration);
    return ret;
}