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

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

Introduction

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

Prototype

public int getTotalHits() 

Source Link

Document

The total number of documents that matched this query.

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 ww.  j a  v  a  2  s.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();//w  w  w . j  ava2 s. c o 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.brutusin.fleadb.pagination.PaginatorImpl.java

License:Apache License

public int getTotalHits() {
    if (totalHits == null) {
        try {//from  w  ww.  j a v a  2 s  . co  m
            TopDocsCollector documentCollector = TopFieldCollector.create(this.sort, 1, null, false, false,
                    false, false);
            searcher.search(this.q, documentCollector);
            this.totalHits = documentCollector.getTotalHits();
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }
    return this.totalHits;
}

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  www  . j a v  a 2  s.  co 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 www .  ja  va  2  s.  co  m
    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;
}

From source file:org.vsw.nlp.index.LuceneIndexUnitTest.java

License:Open Source License

@Test
public void run() throws Exception {
    FileInputStream is = new FileInputStream("src/data/nlp/meaning/vn.place.json");
    JsonParser parser = getJsonParser(is);
    DocumentReader reader = new DefaultDocumentReader(NLPResource.getInstance());
    String[] filterWords = { "thuc" };
    VNTokenizer tokenizer = new VNTokenizer(reader, filterWords);
    DocumentIndexer indexer = new DocumentIndexer();
    int idx = 0;/*from  w  ww . j a  v a  2  s.c o m*/
    while (parser.nextToken() != null && idx < 10) {
        Entity meaning = parser.readValueAs(Entity.class);
        IndexDocument idoc = new IndexDocument();
        String name = meaning.getName();
        if (name != null)
            name = name.toLowerCase();
        idoc.add("name", name);
        idoc.add("topic", tokenizer.split(meaning.getTopic()));
        idoc.add("udesc", tokenizer.split(meaning.getUDescription()));
        indexer.index(idoc);
        //if(meaning.getName() != null)System.out.println(meaning.getName());
        //idx++ ;
    }
    indexer.commit();
    indexer.close();
    DocumentSearcher searcher = new DocumentSearcher(indexer.getDirectory());
    TopDocsCollector collector = null;
    for (int i = 0; i < 1000; i++) {
        collector = searcher.query("udesc:cn.th");
    }
    int LOOP = 100000;
    long start = System.currentTimeMillis();
    for (int i = 0; i < LOOP; i++) {
        collector = searcher.query("+(udesc:(bin.ha))", 5);
    }
    long execute = System.currentTimeMillis() - start;
    System.out.println("Execute in: " + execute + "ms");
    System.out
            .println("Hit: " + collector.getTotalHits() + ", return: " + collector.topDocs().scoreDocs.length);
}