Example usage for org.apache.lucene.search MultiTermQuery.TopTermsScoringBooleanQueryRewrite MultiTermQuery.TopTermsScoringBooleanQueryRewrite

List of usage examples for org.apache.lucene.search MultiTermQuery.TopTermsScoringBooleanQueryRewrite MultiTermQuery.TopTermsScoringBooleanQueryRewrite

Introduction

In this page you can find the example usage for org.apache.lucene.search MultiTermQuery.TopTermsScoringBooleanQueryRewrite MultiTermQuery.TopTermsScoringBooleanQueryRewrite.

Prototype

public TopTermsScoringBooleanQueryRewrite(int size) 

Source Link

Document

Create a TopTermsScoringBooleanQueryRewrite for at most size terms.

Usage

From source file:com.o19s.solr.swan.highlight.SpanAwareFieldQuery.java

License:Apache License

void flatten(Query sourceQuery, IndexReader reader, Collection<Query> flatQueries) throws IOException {
    if (sourceQuery instanceof BooleanQuery) {
        BooleanQuery bq = (BooleanQuery) sourceQuery;
        for (BooleanClause clause : bq.getClauses()) {
            if (!clause.isProhibited())
                flatten(clause.getQuery(), reader, flatQueries);
        }//from  ww w  .  j a  va 2s .c om
    } else if (sourceQuery instanceof DisjunctionMaxQuery) {
        DisjunctionMaxQuery dmq = (DisjunctionMaxQuery) sourceQuery;
        for (Query query : dmq) {
            flatten(query, reader, flatQueries);
        }
    } else if (sourceQuery instanceof TermQuery) {
        if (!flatQueries.contains(sourceQuery))
            flatQueries.add(sourceQuery);
    } else if (sourceQuery instanceof MultiTermQuery && reader != null) {
        MultiTermQuery copy = (MultiTermQuery) sourceQuery.clone();
        copy.setRewriteMethod(new MultiTermQuery.TopTermsScoringBooleanQueryRewrite(MAX_MTQ_TERMS));
        BooleanQuery mtqTerms = (BooleanQuery) copy.rewrite(reader);
        flatten(mtqTerms, reader, flatQueries);
    } else if (sourceQuery instanceof PhraseQuery) {
        if (!flatQueries.contains(sourceQuery)) {
            PhraseQuery pq = (PhraseQuery) sourceQuery;
            if (pq.getTerms().length > 1)
                flatQueries.add(pq);
            else if (pq.getTerms().length == 1) {
                flatQueries.add(new TermQuery(pq.getTerms()[0]));
            }
        }
    } else if (sourceQuery instanceof SpanQuery) {
        //TODO Note that the way we are doing phrases, they become SpanQueries - thus we loose
        //all of the corner case fixes for the phrases already in highlighing - the result will be
        //phrases that have different color highlights for each term
        Set<Term> terms = new LinkedHashSet<Term>();
        List<AtomicReaderContext> readerContexts = reader.getContext().leaves();

        int offset = 0;

        if (readerContexts.size() < 1) {
            return;
        }
        for (AtomicReaderContext arc : readerContexts) {
            if (sourceQuery instanceof SpanNotQuery) {
                SpanNotQuery query = (SpanNotQuery) sourceQuery;
                addSpansPositions(offset, query.getField(),
                        query.getInclude().getSpans(arc, null, new HashMap<Term, TermContext>()));
            } else {
                SpanQuery query = (SpanQuery) sourceQuery;
                addSpansPositions(offset, query.getField(),
                        query.getSpans(arc, null, new HashMap<Term, TermContext>()));
            }
            offset += arc.reader().maxDoc();
        }

        //TODO it is necessary to call getSpans first so that if there is a MultiTerm query it get's rewritten by com.o19s.solr.swan.nodes.SwanTermNode.SwanSpanMultiTermQueryWrapper
        //no easy way around this
        sourceQuery.extractTerms(terms);
        for (Term t : terms) {
            flatQueries.add(new SpanTermQuery(t));//TODO need to check that this isn't already in the flatQueries (see example above)
        }

    }
    // else discard queries
}

From source file:org.elasticsearch.search.highlight.PostingsHighlighter.java

License:Apache License

private static void overrideMultiTermRewriteMethod(Query query,
        List<Tuple<MultiTermQuery, MultiTermQuery.RewriteMethod>> modifiedMultiTermQueries) {

    if (query instanceof MultiTermQuery) {
        MultiTermQuery originalMultiTermQuery = (MultiTermQuery) query;
        if (!allowsForTermExtraction(originalMultiTermQuery.getRewriteMethod())) {
            MultiTermQuery.RewriteMethod originalRewriteMethod = originalMultiTermQuery.getRewriteMethod();
            originalMultiTermQuery.setRewriteMethod(new MultiTermQuery.TopTermsScoringBooleanQueryRewrite(50));
            //we need to rewrite anyway if it is a multi term query which was rewritten with the wrong rewrite method
            modifiedMultiTermQueries.add(Tuple.tuple(originalMultiTermQuery, originalRewriteMethod));
        }//  ww w .j a  va 2s .  c  o m
    }

    if (query instanceof BooleanQuery) {
        BooleanQuery booleanQuery = (BooleanQuery) query;
        for (BooleanClause booleanClause : booleanQuery) {
            overrideMultiTermRewriteMethod(booleanClause.getQuery(), modifiedMultiTermQueries);
        }
    }

    if (query instanceof XFilteredQuery) {
        overrideMultiTermRewriteMethod(((XFilteredQuery) query).getQuery(), modifiedMultiTermQueries);
    }

    if (query instanceof FilteredQuery) {
        overrideMultiTermRewriteMethod(((FilteredQuery) query).getQuery(), modifiedMultiTermQueries);
    }

    if (query instanceof ConstantScoreQuery) {
        overrideMultiTermRewriteMethod(((ConstantScoreQuery) query).getQuery(), modifiedMultiTermQueries);
    }
}