List of usage examples for org.apache.lucene.search IndexSearcher rewrite
public Query rewrite(Query original) throws IOException
From source file:com.appeligo.alerts.KeywordAlertThread.java
License:Apache License
private void checkAgainstEpg() throws IOException { final SearchResults searchResults = new SearchResults(alertManager.getLuceneIndex(), null, 10, null); searchResults.setSearchType(SearchType.FUTURE); Calendar cal = Calendar.getInstance(); cal.add(Calendar.HOUR, -20); // Allowing for an abnormally long 4 hour EPG index update should be safe enough Date yesterday = cal.getTime(); searchResults.setModifiedSince(yesterday); final IndexSearcher searcher = searchResults.newIndexSearcher(); try {//from w ww . jav a 2s . c om boolean maxExceeded = executeKeywordSearch(new SearchExecutor() { Query luceneQuery; public Hits search(String lineupId, String normalizedQuery) throws ParseException, IOException { searchResults.setQuery(proximitize(normalizedQuery)); searchResults.setLineup(lineupId); luceneQuery = searchResults.generateLuceneQuery(searcher); //Required to use the highlighter luceneQuery = searcher.rewrite(luceneQuery); return searcher.search(luceneQuery); } public Query getLuceneQuery() { return luceneQuery; } }, "keyword_alert_epg", false); if (maxExceeded) { log.fatal("Reached max consecutive exceptions for KeywordAlertThread. Exiting thread immediately."); return; } } finally { searcher.close(); } if (log.isDebugEnabled()) log.debug("KeywordAlertThread done with check of KeywordAlerts against EPG data"); }
From source file:com.dasasian.chok.lucene.LuceneServer.java
License:Apache License
/** * Rewrites a query for the given shards * * @param original the original query/*from www . j ava 2 s.c o m*/ * @param shardNames the names of the shards * @return the rewritten query * @throws IOException when an error occurs */ protected Query rewrite(final Query original, final String[] shardNames) throws IOException { final Query[] queries = new Query[shardNames.length]; for (int i = 0; i < shardNames.length; i++) { final String shard = shardNames[i]; final IndexSearcher searcher = getSearcherByShard(shard); if (searcher == null) { throw new IllegalStateException( "no index-server for shard '" + shard + "' found - probably undeployed"); } else { queries[i] = searcher.rewrite(original); } } if (queries.length > 0 && queries[0] != null) { return queries[0].combine(queries); } else { LOG.error("No queries available for shards: " + Arrays.toString(shardNames)); } return original; }
From source file:com.flaptor.hounder.searcher.ReloadableIndexHandler.java
License:Apache License
/** * Executes <code>IndexSearch.search(Query query, Filter filter, Sort sort)</code> on current index in a * thread safe way.// ww w . j ava 2 s . co m * * @param query the lucene Query to use for this search. * @param filter the lucene filter to use. * @param sort the lucene sort to use. * @return a Pair of <SearchResults, Query>. * The SearchResults object is the result of the query. If the search returned less document than those required, * it returs as many as there are. The scores returned in the SearchResults are not normalized, which is important to * allow to compare result from different searchers (see the SearchCluster design). * The Query is the same input query, but rewritten. This expands several kinds of queries into term queries. It * is usefull to generate highlighting of snippets, but can be ignored if not. * @throws NoIndexActiveException if there is no index active or if <code>IndexSearcher.search()</code> failed. * See #org.apache.lucene.search.IndexSearcher for details. */ public Pair<GroupedSearchResults, Query> search(final Query query, final Filter filter, final Sort sort, final int offset, final int groupCount, AGroup groupBy, int groupSize) throws IOException, NoIndexActiveException, SearchTimeoutException, SearcherException { IndexRepository ir = currentIndexRepository.get(); if (null == ir) { throw new NoIndexActiveException(); } IndexSearcher searcher = ir.getIndexSearcher(); try { if (shouldSaveQuery()) { saveQuery(query, filter, sort, offset, groupCount, groupBy, groupSize); } TopDocs tdocs; long startTime = System.currentTimeMillis(); if (null == sort) { //Lucene's documentation is not clear about whether search may take a null sort, so... tdocs = searcher.search(query, filter, offset + groupSize * groupCount * slackFactor); } else { tdocs = searcher.search(query, filter, offset + groupSize * groupCount * slackFactor, sort); } statistics.notifyEventValue("lucene work time", System.currentTimeMillis() - startTime); // Exceptions are thrown to upper layer, but if we got here, assume everything is ok. Query rewrittenQuery = searcher.rewrite(query); GroupedSearchResults results = pageResults(tdocs, searcher, offset, groupCount, groupBy, groupSize); if (null == results) { throw new RuntimeException("GroupedSearchResults is NULL"); } return (new Pair<GroupedSearchResults, Query>(results, rewrittenQuery)); } catch (IOException e) { statistics.notifyEventError("lucene work time"); throw e; } finally { ir.releaseIndexSearcher(searcher); } }
From source file:com.gitblit.LuceneExecutor.java
License:Apache License
/** * Searches the specified repositories for the given text or query * // w ww . j av a2 s. co m * @param text * if the text is null or empty, null is returned * @param page * the page number to retrieve. page is 1-indexed. * @param pageSize * the number of elements to return for this page * @param repositories * a list of repositories to search. if no repositories are * specified null is returned. * @return a list of SearchResults in order from highest to the lowest score * */ public List<SearchResult> search(String text, int page, int pageSize, String... repositories) { if (StringUtils.isEmpty(text)) { return null; } if (ArrayUtils.isEmpty(repositories)) { return null; } Set<SearchResult> results = new LinkedHashSet<SearchResult>(); StandardAnalyzer analyzer = new StandardAnalyzer(LUCENE_VERSION); try { // default search checks summary and content BooleanQuery query = new BooleanQuery(); QueryParser qp; qp = new QueryParser(LUCENE_VERSION, FIELD_SUMMARY, analyzer); qp.setAllowLeadingWildcard(true); query.add(qp.parse(text), Occur.SHOULD); qp = new QueryParser(LUCENE_VERSION, FIELD_CONTENT, analyzer); qp.setAllowLeadingWildcard(true); query.add(qp.parse(text), Occur.SHOULD); IndexSearcher searcher; if (repositories.length == 1) { // single repository search searcher = getIndexSearcher(repositories[0]); } else { // multiple repository search List<IndexReader> readers = new ArrayList<IndexReader>(); for (String repository : repositories) { IndexSearcher repositoryIndex = getIndexSearcher(repository); readers.add(repositoryIndex.getIndexReader()); } IndexReader[] rdrs = readers.toArray(new IndexReader[readers.size()]); MultiSourceReader reader = new MultiSourceReader(rdrs); searcher = new IndexSearcher(reader); } Query rewrittenQuery = searcher.rewrite(query); logger.debug(rewrittenQuery.toString()); TopScoreDocCollector collector = TopScoreDocCollector.create(5000, true); searcher.search(rewrittenQuery, collector); int offset = Math.max(0, (page - 1) * pageSize); ScoreDoc[] hits = collector.topDocs(offset, pageSize).scoreDocs; int totalHits = collector.getTotalHits(); for (int i = 0; i < hits.length; i++) { int docId = hits[i].doc; Document doc = searcher.doc(docId); SearchResult result = createSearchResult(doc, hits[i].score, offset + i + 1, totalHits); if (repositories.length == 1) { // single repository search result.repository = repositories[0]; } else { // multi-repository search MultiSourceReader reader = (MultiSourceReader) searcher.getIndexReader(); int index = reader.getSourceIndex(docId); result.repository = repositories[index]; } String content = doc.get(FIELD_CONTENT); result.fragment = getHighlightedFragment(analyzer, query, content, result); results.add(result); } } catch (Exception e) { logger.error(MessageFormat.format("Exception while searching for {0}", text), e); } return new ArrayList<SearchResult>(results); }
From source file:com.gitblit.service.LuceneService.java
License:Apache License
/** * Searches the specified repositories for the given text or query * * @param text// ww w .j ava 2 s . c o m * if the text is null or empty, null is returned * @param page * the page number to retrieve. page is 1-indexed. * @param pageSize * the number of elements to return for this page * @param repositories * a list of repositories to search. if no repositories are * specified null is returned. * @return a list of SearchResults in order from highest to the lowest score * */ public List<SearchResult> search(String text, int page, int pageSize, String... repositories) { if (StringUtils.isEmpty(text)) { return null; } if (ArrayUtils.isEmpty(repositories)) { return null; } Set<SearchResult> results = new LinkedHashSet<SearchResult>(); StandardAnalyzer analyzer = new StandardAnalyzer(); try { // default search checks summary and content BooleanQuery.Builder bldr = new BooleanQuery.Builder(); QueryParser qp; qp = new QueryParser(FIELD_SUMMARY, analyzer); qp.setAllowLeadingWildcard(true); bldr.add(qp.parse(text), Occur.SHOULD); qp = new QueryParser(FIELD_CONTENT, analyzer); qp.setAllowLeadingWildcard(true); bldr.add(qp.parse(text), Occur.SHOULD); IndexSearcher searcher; if (repositories.length == 1) { // single repository search searcher = getIndexSearcher(repositories[0]); } else { // multiple repository search List<IndexReader> readers = new ArrayList<IndexReader>(); for (String repository : repositories) { IndexSearcher repositoryIndex = getIndexSearcher(repository); readers.add(repositoryIndex.getIndexReader()); } IndexReader[] rdrs = readers.toArray(new IndexReader[readers.size()]); MultiSourceReader reader = new MultiSourceReader(rdrs); searcher = new IndexSearcher(reader); } BooleanQuery query = bldr.build(); Query rewrittenQuery = searcher.rewrite(query); logger.debug(rewrittenQuery.toString()); TopScoreDocCollector collector = TopScoreDocCollector.create(5000); searcher.search(rewrittenQuery, collector); int offset = Math.max(0, (page - 1) * pageSize); ScoreDoc[] hits = collector.topDocs(offset, pageSize).scoreDocs; int totalHits = collector.getTotalHits(); for (int i = 0; i < hits.length; i++) { int docId = hits[i].doc; Document doc = searcher.doc(docId); SearchResult result = createSearchResult(doc, hits[i].score, offset + i + 1, totalHits); if (repositories.length == 1) { // single repository search result.repository = repositories[0]; } else { // multi-repository search MultiSourceReader reader = (MultiSourceReader) searcher.getIndexReader(); int index = reader.getSourceIndex(docId); result.repository = repositories[index]; } String content = doc.get(FIELD_CONTENT); result.fragment = getHighlightedFragment(analyzer, query, content, result); results.add(result); } } catch (Exception e) { logger.error(MessageFormat.format("Exception while searching for {0}", text), e); } return new ArrayList<SearchResult>(results); }
From source file:com.gitblit.tickets.TicketIndexer.java
License:Apache License
/** * Search for tickets matching the query. The returned tickets are * shadows of the real ticket, but suitable for a results list. * * @param repository/* w w w . j ava 2 s . c o m*/ * @param text * @param page * @param pageSize * @return search results */ public List<QueryResult> searchFor(RepositoryModel repository, String text, int page, int pageSize) { if (StringUtils.isEmpty(text)) { return Collections.emptyList(); } Set<QueryResult> results = new LinkedHashSet<QueryResult>(); StandardAnalyzer analyzer = new StandardAnalyzer(); try { // search the title, description and content BooleanQuery.Builder bldr = new BooleanQuery.Builder(); QueryParser qp; qp = new QueryParser(Lucene.title.name(), analyzer); qp.setAllowLeadingWildcard(true); bldr.add(qp.parse(text), Occur.SHOULD); qp = new QueryParser(Lucene.body.name(), analyzer); qp.setAllowLeadingWildcard(true); bldr.add(qp.parse(text), Occur.SHOULD); qp = new QueryParser(Lucene.content.name(), analyzer); qp.setAllowLeadingWildcard(true); bldr.add(qp.parse(text), Occur.SHOULD); IndexSearcher searcher = getSearcher(); Query rewrittenQuery = searcher.rewrite(bldr.build()); log.debug(rewrittenQuery.toString()); TopScoreDocCollector collector = TopScoreDocCollector.create(5000); searcher.search(rewrittenQuery, collector); int offset = Math.max(0, (page - 1) * pageSize); ScoreDoc[] hits = collector.topDocs(offset, pageSize).scoreDocs; for (int i = 0; i < hits.length; i++) { int docId = hits[i].doc; Document doc = searcher.doc(docId); QueryResult result = docToQueryResult(doc); if (repository != null) { if (!result.repository.equalsIgnoreCase(repository.name)) { continue; } } results.add(result); } } catch (Exception e) { log.error(MessageFormat.format("Exception while searching for {0}", text), e); } return new ArrayList<QueryResult>(results); }
From source file:com.gitblit.tickets.TicketIndexer.java
License:Apache License
/** * Search for tickets matching the query. The returned tickets are * shadows of the real ticket, but suitable for a results list. * * @param text//from www. j a va 2s .c om * @param page * @param pageSize * @param sortBy * @param desc * @return */ public List<QueryResult> queryFor(String queryText, int page, int pageSize, String sortBy, boolean desc) { if (StringUtils.isEmpty(queryText)) { return Collections.emptyList(); } Set<QueryResult> results = new LinkedHashSet<QueryResult>(); StandardAnalyzer analyzer = new StandardAnalyzer(); try { QueryParser qp = new QueryParser(Lucene.content.name(), analyzer); Query query = qp.parse(queryText); IndexSearcher searcher = getSearcher(); Query rewrittenQuery = searcher.rewrite(query); log.debug(rewrittenQuery.toString()); Sort sort; if (sortBy == null) { sort = new Sort(Lucene.created.asSortField(desc)); } else { sort = new Sort(Lucene.fromString(sortBy).asSortField(desc)); } int maxSize = 5000; TopFieldDocs docs = searcher.search(rewrittenQuery, maxSize, sort, false, false); int size = (pageSize <= 0) ? maxSize : pageSize; int offset = Math.max(0, (page - 1) * size); ScoreDoc[] hits = subset(docs.scoreDocs, offset, size); for (int i = 0; i < hits.length; i++) { int docId = hits[i].doc; Document doc = searcher.doc(docId); QueryResult result = docToQueryResult(doc); result.docId = docId; result.totalResults = docs.totalHits; results.add(result); } } catch (Exception e) { log.error(MessageFormat.format("Exception while searching for {0}", queryText), e); } return new ArrayList<QueryResult>(results); }
From source file:com.ibm.jaql.lang.expr.index.ProbeLuceneFn.java
License:Apache License
@Override public JsonIterator iter(Context context) throws Exception { JsonRecord fd = (JsonRecord) exprs[0].eval(context); if (fd == null) { return JsonIterator.NULL; }/*w w w .j ava 2s. c o m*/ JsonString loc = (JsonString) fd.get(new JsonString("location")); if (loc == null) { return JsonIterator.NULL; } JsonString jquery = (JsonString) exprs[1].eval(context); if (jquery == null) { return JsonIterator.NULL; } HashSet<String> fields = null; JsonIterator iter = exprs[2].iter(context); for (JsonValue sv : iter) { JsonString s = (JsonString) sv; if (s != null) { if (fields == null) { fields = new HashSet<String>(); } fields.add(s.toString()); } } final FieldSelector fieldSelector = (fields == null) ? null : new SetBasedFieldSelector(fields, new HashSet<String>()); final IndexSearcher searcher = new IndexSearcher(loc.toString()); Analyzer analyzer = new StandardAnalyzer(); QueryParser qp = new QueryParser("key", analyzer); Query query = qp.parse(jquery.toString()); query = searcher.rewrite(query); final Scorer scorer = query.weight(searcher).scorer(searcher.getIndexReader()); final BufferedJsonRecord rec = new BufferedJsonRecord(); final JsonString jdoc = new JsonString("doc"); final MutableJsonLong jdocid = new MutableJsonLong(); return new JsonIterator(rec) { @Override public boolean moveNext() throws Exception { if (!scorer.next()) { return false; } rec.clear(); int i = scorer.doc(); jdocid.set(i); rec.add(jdoc, jdocid); if (fieldSelector != null) { Document doc = searcher.doc(i, fieldSelector); for (Object x : doc.getFields()) { Field f = (Field) x; String name = f.name(); byte[] val = f.binaryValue(); ByteArrayInputStream bais = new ByteArrayInputStream(val); // TODO: reuse DataInputStream in = new DataInputStream(bais); // TODO: reuse JsonValue ival = serializer.read(in, null); rec.add(new JsonString(name), ival); } } return true; // currentValue == rec } }; }
From source file:com.nearinfinity.blur.lucene.search.IterablePaging.java
License:Apache License
public IterablePaging(AtomicBoolean running, IndexSearcher searcher, Query query, int numHitsToCollect, TotalHitsRef totalHitsRef, ProgressRef progressRef) throws IOException { this.running = running; this.query = searcher.rewrite(query); this.searcher = searcher; this.numHitsToCollect = numHitsToCollect; this.totalHitsRef = totalHitsRef == null ? this.totalHitsRef : totalHitsRef; this.progressRef = progressRef == null ? this.progressRef : progressRef; }
From source file:de.ilias.services.lucene.search.RPCSearchHandler.java
License:Open Source License
/** * //from ww w. j a v a2s. c o m * @param clientKey * @param objIds * @return */ public String highlight(String clientKey, Vector<Integer> objIds, String queryString) { LocalSettings.setClientKey(clientKey); FieldInfo fieldInfo; IndexSearcher searcher; String rewrittenQuery; try { fieldInfo = FieldInfo.getInstance(LocalSettings.getClientKey()); long start = new java.util.Date().getTime(); // Rewrite query QueryRewriter rewriter = new QueryRewriter(QueryRewriter.MODE_HIGHLIGHT, queryString); rewrittenQuery = rewriter.rewrite(objIds); logger.info("Searching for: " + rewrittenQuery); searcher = SearchHolder.getInstance().getSearcher(); Vector<Occur> occurs = new Vector<Occur>(); for (int i = 0; i < fieldInfo.getFieldSize(); i++) { occurs.add(BooleanClause.Occur.SHOULD); } Query query = searcher.rewrite(MultiFieldQueryParser.parse(rewrittenQuery, fieldInfo.getFieldsAsStringArray(), occurs.toArray(new Occur[0]), new StandardAnalyzer())); logger.info("What occurs" + occurs.toString()); logger.debug("Rewritten query is: " + query.toString()); TopDocCollector collector = new TopDocCollector(1000); searcher.search(query, collector); ScoreDoc[] hits = collector.topDocs().scoreDocs; long h_start = new java.util.Date().getTime(); HitHighlighter hh = new HitHighlighter(query, hits); hh.highlight(); long h_end = new java.util.Date().getTime(); //logger.debug(hh.toXML()); long end = new java.util.Date().getTime(); logger.info("Highlighter time: " + (h_end - h_start)); logger.info("Total time: " + (end - start)); return hh.toXML(); } catch (CorruptIndexException e) { logger.fatal(e); } catch (ConfigurationException e) { logger.error(e); } catch (ParseException e) { logger.warn(e); } catch (IOException e) { logger.error(e); } catch (Exception e) { StringWriter writer = new StringWriter(); e.printStackTrace(new PrintWriter(writer)); logger.error(writer.toString()); } return ""; }