Search in sources :

Example 86 with BooleanClause

use of org.apache.lucene.search.BooleanClause in project lucene-solr by apache.

the class QueryParser method Query.

public final Query Query(String field) throws ParseException {
    List<BooleanClause> clauses = new ArrayList<BooleanClause>();
    Query q, firstQuery = null;
    int conj, mods;
    if (jj_2_1(2)) {
        firstQuery = MultiTerm(field, clauses);
    } else {
        switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
            case NOT:
            case PLUS:
            case MINUS:
            case BAREOPER:
            case LPAREN:
            case STAR:
            case QUOTED:
            case TERM:
            case PREFIXTERM:
            case WILDTERM:
            case REGEXPTERM:
            case RANGEIN_START:
            case RANGEEX_START:
            case NUMBER:
                mods = Modifiers();
                q = Clause(field);
                addClause(clauses, CONJ_NONE, mods, q);
                if (mods == MOD_NONE) {
                    firstQuery = q;
                }
                break;
            default:
                jj_la1[4] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
        }
    }
    label_1: while (true) {
        switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
            case AND:
            case OR:
            case NOT:
            case PLUS:
            case MINUS:
            case BAREOPER:
            case LPAREN:
            case STAR:
            case QUOTED:
            case TERM:
            case PREFIXTERM:
            case WILDTERM:
            case REGEXPTERM:
            case RANGEIN_START:
            case RANGEEX_START:
            case NUMBER:
                ;
                break;
            default:
                jj_la1[5] = jj_gen;
                break label_1;
        }
        if (jj_2_2(2)) {
            MultiTerm(field, clauses);
        } else {
            switch((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
                case AND:
                case OR:
                case NOT:
                case PLUS:
                case MINUS:
                case BAREOPER:
                case LPAREN:
                case STAR:
                case QUOTED:
                case TERM:
                case PREFIXTERM:
                case WILDTERM:
                case REGEXPTERM:
                case RANGEIN_START:
                case RANGEEX_START:
                case NUMBER:
                    conj = Conjunction();
                    mods = Modifiers();
                    q = Clause(field);
                    addClause(clauses, conj, mods, q);
                    break;
                default:
                    jj_la1[6] = jj_gen;
                    jj_consume_token(-1);
                    throw new ParseException();
            }
        }
    }
    if (clauses.size() == 1 && firstQuery != null) {
        {
            if (true)
                return firstQuery;
        }
    } else {
        {
            if (true)
                return getBooleanQuery(clauses);
        }
    }
    throw new Error("Missing return statement in function");
}
Also used : BooleanClause(org.apache.lucene.search.BooleanClause) Query(org.apache.lucene.search.Query) TermRangeQuery(org.apache.lucene.search.TermRangeQuery) ArrayList(java.util.ArrayList)

Example 87 with BooleanClause

use of org.apache.lucene.search.BooleanClause in project lucene-solr by apache.

the class TestPayloadTermQuery method testNoPayload.

public void testNoPayload() throws Exception {
    SpanQuery q1 = new PayloadScoreQuery(new SpanTermQuery(new Term(PayloadHelper.NO_PAYLOAD_FIELD, "zero")), new MaxPayloadFunction());
    SpanQuery q2 = new PayloadScoreQuery(new SpanTermQuery(new Term(PayloadHelper.NO_PAYLOAD_FIELD, "foo")), new MaxPayloadFunction());
    BooleanClause c1 = new BooleanClause(q1, BooleanClause.Occur.MUST);
    BooleanClause c2 = new BooleanClause(q2, BooleanClause.Occur.MUST_NOT);
    BooleanQuery.Builder query = new BooleanQuery.Builder();
    query.add(c1);
    query.add(c2);
    TopDocs hits = searcher.search(query.build(), 100);
    assertTrue("hits is null and it shouldn't be", hits != null);
    assertTrue("hits Size: " + hits.totalHits + " is not: " + 1, hits.totalHits == 1);
    int[] results = new int[1];
    //hits.scoreDocs[0].doc;
    results[0] = 0;
    CheckHits.checkHitCollector(random(), query.build(), PayloadHelper.NO_PAYLOAD_FIELD, searcher, results);
}
Also used : BooleanClause(org.apache.lucene.search.BooleanClause) TopDocs(org.apache.lucene.search.TopDocs) BooleanQuery(org.apache.lucene.search.BooleanQuery) SpanTermQuery(org.apache.lucene.search.spans.SpanTermQuery) Term(org.apache.lucene.index.Term) SpanQuery(org.apache.lucene.search.spans.SpanQuery)

Example 88 with BooleanClause

use of org.apache.lucene.search.BooleanClause in project lucene-solr by apache.

the class MultiFieldQueryParser method getFieldQuery.

@Override
protected Query getFieldQuery(String field, String queryText, boolean quoted) throws ParseException {
    if (field == null) {
        List<Query> clauses = new ArrayList<>();
        Query[] fieldQueries = new Query[fields.length];
        int maxTerms = 0;
        for (int i = 0; i < fields.length; i++) {
            Query q = super.getFieldQuery(fields[i], queryText, quoted);
            if (q != null) {
                if (q instanceof BooleanQuery) {
                    maxTerms = Math.max(maxTerms, ((BooleanQuery) q).clauses().size());
                } else {
                    maxTerms = Math.max(1, maxTerms);
                }
                fieldQueries[i] = q;
            }
        }
        for (int termNum = 0; termNum < maxTerms; termNum++) {
            List<Query> termClauses = new ArrayList<>();
            for (int i = 0; i < fields.length; i++) {
                if (fieldQueries[i] != null) {
                    Query q = null;
                    if (fieldQueries[i] instanceof BooleanQuery) {
                        List<BooleanClause> nestedClauses = ((BooleanQuery) fieldQueries[i]).clauses();
                        if (termNum < nestedClauses.size()) {
                            q = nestedClauses.get(termNum).getQuery();
                        }
                    } else if (termNum == 0) {
                        // e.g. TermQuery-s
                        q = fieldQueries[i];
                    }
                    if (q != null) {
                        if (boosts != null) {
                            //Get the boost from the map and apply them
                            Float boost = boosts.get(fields[i]);
                            if (boost != null) {
                                q = new BoostQuery(q, boost);
                            }
                        }
                        termClauses.add(q);
                    }
                }
            }
            if (maxTerms > 1) {
                if (termClauses.size() > 0) {
                    BooleanQuery.Builder builder = newBooleanQuery();
                    for (Query termClause : termClauses) {
                        builder.add(termClause, BooleanClause.Occur.SHOULD);
                    }
                    clauses.add(builder.build());
                }
            } else {
                clauses.addAll(termClauses);
            }
        }
        if (// happens for stopwords
        clauses.size() == 0)
            return null;
        return getMultiFieldQuery(clauses);
    }
    Query q = super.getFieldQuery(field, queryText, quoted);
    return q;
}
Also used : BooleanClause(org.apache.lucene.search.BooleanClause) BooleanQuery(org.apache.lucene.search.BooleanQuery) Query(org.apache.lucene.search.Query) BooleanQuery(org.apache.lucene.search.BooleanQuery) BoostQuery(org.apache.lucene.search.BoostQuery) MultiPhraseQuery(org.apache.lucene.search.MultiPhraseQuery) PhraseQuery(org.apache.lucene.search.PhraseQuery) ArrayList(java.util.ArrayList) BoostQuery(org.apache.lucene.search.BoostQuery)

Example 89 with BooleanClause

use of org.apache.lucene.search.BooleanClause in project lucene-solr by apache.

the class SolrPluginUtils method flattenBooleanQuery.

private static void flattenBooleanQuery(BooleanQuery.Builder to, BooleanQuery from, float fromBoost) {
    for (BooleanClause clause : from.clauses()) {
        Query cq = clause.getQuery();
        float boost = fromBoost;
        while (cq instanceof BoostQuery) {
            BoostQuery bq = (BoostQuery) cq;
            cq = bq.getQuery();
            boost *= bq.getBoost();
        }
        if (cq instanceof BooleanQuery && !clause.isRequired() && !clause.isProhibited()) {
            /* we can recurse */
            flattenBooleanQuery(to, (BooleanQuery) cq, boost);
        } else {
            to.add(clause);
        }
    }
}
Also used : BooleanClause(org.apache.lucene.search.BooleanClause) BooleanQuery(org.apache.lucene.search.BooleanQuery) Query(org.apache.lucene.search.Query) DisjunctionMaxQuery(org.apache.lucene.search.DisjunctionMaxQuery) BooleanQuery(org.apache.lucene.search.BooleanQuery) BoostQuery(org.apache.lucene.search.BoostQuery) BoostQuery(org.apache.lucene.search.BoostQuery)

Example 90 with BooleanClause

use of org.apache.lucene.search.BooleanClause in project lucene-solr by apache.

the class SolrPluginUtils method setMinShouldMatch.

/**
   * Checks the number of optional clauses in the query, and compares it
   * with the specification string to determine the proper value to use.
   * <p>
   * If mmAutoRelax=true, we'll perform auto relaxation of mm if tokens
   * are removed from some but not all DisMax clauses, as can happen when
   * stopwords or punctuation tokens are removed in analysis.
   * </p>
   * <p>
   * Details about the specification format can be found
   * <a href="doc-files/min-should-match.html">here</a>
   * </p>
   *
   * <p>A few important notes...</p>
   * <ul>
   * <li>
   * If the calculations based on the specification determine that no
   * optional clauses are needed, BooleanQuerysetMinMumberShouldMatch
   * will never be called, but the usual rules about BooleanQueries
   * still apply at search time (a BooleanQuery containing no required
   * clauses must still match at least one optional clause)
   * <li>
   * <li>
   * No matter what number the calculation arrives at,
   * BooleanQuery.setMinShouldMatch() will never be called with a
   * value greater then the number of optional clauses (or less then 1)
   * </li>
   * </ul>
   *
   * <p>:TODO: should optimize the case where number is same
   * as clauses to just make them all "required"
   * </p>
   *
   * @param q The query as a BooleanQuery.Builder
   * @param spec The mm spec
   * @param mmAutoRelax whether to perform auto relaxation of mm if tokens are removed from some but not all DisMax clauses
   */
public static void setMinShouldMatch(BooleanQuery.Builder q, String spec, boolean mmAutoRelax) {
    int optionalClauses = 0;
    int maxDisjunctsSize = 0;
    int optionalDismaxClauses = 0;
    for (BooleanClause c : q.build().clauses()) {
        if (c.getOccur() == Occur.SHOULD) {
            if (mmAutoRelax && c.getQuery() instanceof DisjunctionMaxQuery) {
                int numDisjuncts = ((DisjunctionMaxQuery) c.getQuery()).getDisjuncts().size();
                if (numDisjuncts > maxDisjunctsSize) {
                    maxDisjunctsSize = numDisjuncts;
                    optionalDismaxClauses = 1;
                } else if (numDisjuncts == maxDisjunctsSize) {
                    optionalDismaxClauses++;
                }
            } else {
                optionalClauses++;
            }
        }
    }
    int msm = calculateMinShouldMatch(optionalClauses + optionalDismaxClauses, spec);
    if (0 < msm) {
        q.setMinimumNumberShouldMatch(msm);
    }
}
Also used : BooleanClause(org.apache.lucene.search.BooleanClause) DisjunctionMaxQuery(org.apache.lucene.search.DisjunctionMaxQuery)

Aggregations

BooleanClause (org.apache.lucene.search.BooleanClause)102 BooleanQuery (org.apache.lucene.search.BooleanQuery)92 Query (org.apache.lucene.search.Query)56 TermQuery (org.apache.lucene.search.TermQuery)46 Term (org.apache.lucene.index.Term)44 BoostQuery (org.apache.lucene.search.BoostQuery)33 ArrayList (java.util.ArrayList)23 MatchAllDocsQuery (org.apache.lucene.search.MatchAllDocsQuery)21 PhraseQuery (org.apache.lucene.search.PhraseQuery)20 DisjunctionMaxQuery (org.apache.lucene.search.DisjunctionMaxQuery)19 SynonymQuery (org.apache.lucene.search.SynonymQuery)18 SpanOrQuery (org.apache.lucene.search.spans.SpanOrQuery)18 SpanNearQuery (org.apache.lucene.search.spans.SpanNearQuery)17 FuzzyQuery (org.apache.lucene.search.FuzzyQuery)16 SpanQuery (org.apache.lucene.search.spans.SpanQuery)15 ConstantScoreQuery (org.apache.lucene.search.ConstantScoreQuery)14 MatchNoDocsQuery (org.apache.lucene.search.MatchNoDocsQuery)14 WildcardQuery (org.apache.lucene.search.WildcardQuery)14 MultiPhraseQuery (org.apache.lucene.search.MultiPhraseQuery)13 PrefixQuery (org.apache.lucene.search.PrefixQuery)13