List of usage examples for org.apache.lucene.search TopDocsCollector getTotalHits
public int getTotalHits()
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); }