Example usage for org.apache.lucene.search IndexSearcher rewrite

List of usage examples for org.apache.lucene.search IndexSearcher rewrite

Introduction

In this page you can find the example usage for org.apache.lucene.search IndexSearcher rewrite.

Prototype

public Query rewrite(Query original) throws IOException 

Source Link

Document

Expert: called to re-write queries into primitive queries.

Usage

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 "";
}