Example usage for org.apache.lucene.search BooleanQuery getMinimumNumberShouldMatch

List of usage examples for org.apache.lucene.search BooleanQuery getMinimumNumberShouldMatch

Introduction

In this page you can find the example usage for org.apache.lucene.search BooleanQuery getMinimumNumberShouldMatch.

Prototype

public int getMinimumNumberShouldMatch() 

Source Link

Document

Gets the minimum number of the optional BooleanClauses which must be satisfied.

Usage

From source file:de.unihildesheim.iw.lucene.query.RelaxableCommonTermsQuery.java

License:Open Source License

/**
 * Reduce the number of terms that must match by one.
 *
 * @return True, if query was relaxed, false, if no terms left to relax the
 * query//from   www.  j a v  a2  s . c  om
 */
@SuppressWarnings("ReuseOfLocalVariable")
@Override
public boolean relax() {
    boolean relaxed = false;
    if (BooleanQuery.class.isInstance(this.query)) {
        // simple bool query
        final BooleanQuery q = (BooleanQuery) this.query;
        int mm = q.getMinimumNumberShouldMatch();
        if (mm >= 1) {
            if (mm == 1) {
                mm = 0;
            } else {
                mm--;
            }
            q.setMinimumNumberShouldMatch(mm);
            relaxed = true;
            if (LOG.isDebugEnabled()) {
                LOG.debug("Relaxed single clause query to {}", mm);
            }
        }
    } else {
        // disMax
        final List<Query> dj = ((DisjunctionMaxQuery) this.query).getDisjuncts();
        for (final Query q : dj) {
            int mm = ((BooleanQuery) q).getMinimumNumberShouldMatch();
            if (mm >= 1) {
                if (mm == 1) {
                    mm = 0;
                } else {
                    mm--;
                }
                ((BooleanQuery) q).setMinimumNumberShouldMatch(mm);
                relaxed = true;
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Relaxed a clause to {}", mm);
                }
            }
        }
    }
    return relaxed;
}

From source file:it.unibz.instasearch.indexing.querying.VisitableQuery.java

License:Open Source License

/**
 * Recursively go through all the clauses of the query and call the visitor
 * //from w w w  . j  a  va  2 s .  c  om
 * @param query
 * @param queryVisitor
 * @return
 */
private Query accept(Query query, QueryVisitor queryVisitor) {

    Query returnQuery = query;

    if (query instanceof TermQuery) {
        TermQuery termQuery = (TermQuery) query;
        Field field = Field.getByName(termQuery.getTerm().field());

        Query newQuery = queryVisitor.visit(termQuery, field);

        newQuery.setBoost(query.getBoost());
        returnQuery = newQuery;

    } else if (query instanceof BooleanQuery) {
        BooleanQuery boolQuery = (BooleanQuery) query;
        BooleanQuery newBoolQuery = queryVisitor.visit(boolQuery);

        for (BooleanClause boolClause : boolQuery.getClauses()) {
            if (!queryVisitor.visit(boolClause))
                continue;
            Query newQuery = accept(boolClause.getQuery(), queryVisitor);
            boolClause.setQuery(newQuery);
        }

        newBoolQuery.setBoost(boolQuery.getBoost());
        newBoolQuery.setMinimumNumberShouldMatch(boolQuery.getMinimumNumberShouldMatch());

        returnQuery = newBoolQuery;
    } else if (query instanceof FilteredQuery) {
        FilteredQuery fq = (FilteredQuery) query;
        Query newQuery = accept(fq.getQuery(), queryVisitor);

        if (newQuery != fq.getQuery()) {
            FilteredQuery newFq = new FilteredQuery(fq.getQuery(), fq.getFilter());
            newFq.setBoost(fq.getBoost());

            returnQuery = newFq;
        }
    } else if (query instanceof PhraseQuery) {
        PhraseQuery phraseQuery = (PhraseQuery) query;

        returnQuery = queryVisitor.visit(phraseQuery);

    } else if (query instanceof WildcardQuery) {
        WildcardQuery wildcardQuery = (WildcardQuery) query;
        Field field = Field.getByName(wildcardQuery.getTerm().field());

        Query newQuery = queryVisitor.visit(wildcardQuery, field);

        newQuery.setBoost(query.getBoost());
        returnQuery = newQuery;

    } else if (query instanceof PrefixQuery) {
        PrefixQuery prefixQuery = (PrefixQuery) query;
        Field field = Field.getByName(prefixQuery.getPrefix().field());

        Query newQuery = queryVisitor.visit(prefixQuery, field);

        newQuery.setBoost(query.getBoost());
        returnQuery = newQuery;
    } else {
        returnQuery = queryVisitor.visitQuery(query);
    }

    return returnQuery;
}

From source file:org.apache.nutch.searcher.SolrSearchBean.java

License:Apache License

private static String stringify(BooleanQuery bQuery) {
    final StringBuilder buffer = new StringBuilder();
    final boolean needParens = (bQuery.getBoost() != 1.0) || (bQuery.getMinimumNumberShouldMatch() > 0);
    if (needParens) {
        buffer.append("(");
    }//  w  ww  . j a  v a  2  s .c  o m

    final BooleanClause[] clauses = bQuery.getClauses();
    int i = 0;
    for (final BooleanClause c : clauses) {
        if (c.isProhibited())
            buffer.append("-");
        else if (c.isRequired())
            buffer.append("+");

        final org.apache.lucene.search.Query subQuery = c.getQuery();
        if (subQuery instanceof BooleanQuery) { // wrap sub-bools in parens
            buffer.append("(");
            buffer.append(c.getQuery().toString(""));
            buffer.append(")");
        } else if (subQuery instanceof TermQuery) {
            final Term term = ((TermQuery) subQuery).getTerm();
            buffer.append(term.field());
            buffer.append(":\"");
            buffer.append(term.text());
            buffer.append("\"");
        } else {
            buffer.append(" ");
            buffer.append(c.getQuery().toString());
        }

        if (i++ != clauses.length - 1) {
            buffer.append(" ");
        }
    }

    if (needParens) {
        buffer.append(")");
    }

    if (bQuery.getMinimumNumberShouldMatch() > 0) {
        buffer.append('~');
        buffer.append(bQuery.getMinimumNumberShouldMatch());
    }

    if (bQuery.getBoost() != 1.0f) {
        buffer.append(ToStringUtils.boost(bQuery.getBoost()));
    }

    return buffer.toString();
}

From source file:org.apache.solr.util.SolrPluginUtilsTest.java

License:Apache License

@Test
public void testMinShouldMatchCalculator() {

    /* zero is zero is zero */
    assertEquals(0, calcMSM(5, "0"));
    assertEquals(0, calcMSM(5, "0%"));
    assertEquals(0, calcMSM(5, " -5 "));
    assertEquals(0, calcMSM(5, "\n -100% \n"));

    /* basic integers */
    assertEquals(3, calcMSM(5, " \n3\n "));
    assertEquals(2, calcMSM(5, "-3"));
    assertEquals(3, calcMSM(3, "3"));
    assertEquals(0, calcMSM(3, "-3"));
    assertEquals(3, calcMSM(3, "5"));
    assertEquals(0, calcMSM(3, "-5"));

    /* positive percentages with rounding */
    assertEquals(0, calcMSM(3, " \n25% \n"));
    assertEquals(1, calcMSM(4, "25%"));
    assertEquals(1, calcMSM(5, " 25% "));
    assertEquals(2, calcMSM(10, "25%"));

    /* negative percentages with rounding */
    assertEquals(3, calcMSM(3, " \n-25%\n "));
    assertEquals(3, calcMSM(4, "-25%"));
    assertEquals(4, calcMSM(5, "-25%"));
    assertEquals(8, calcMSM(10, "-25%"));

    /* conditional */
    assertEquals(1, calcMSM(1, "3<0"));
    assertEquals(2, calcMSM(2, "3<0"));
    assertEquals(3, calcMSM(3, "3<0"));
    assertEquals(0, calcMSM(4, "3<0"));
    assertEquals(0, calcMSM(5, "3<0"));
    assertEquals(1, calcMSM(1, "3<25%"));
    assertEquals(2, calcMSM(2, " 3\n<\n25% "));
    assertEquals(3, calcMSM(3, "3<25%"));
    assertEquals(1, calcMSM(4, "\n 3 < \n25%\n "));
    assertEquals(1, calcMSM(5, "3<25%"));

    /* multiple conditionals */
    assertEquals(1, calcMSM(1, "\n3 < -25% 10 < -3 \n"));
    assertEquals(2, calcMSM(2, " 3 < -25% 10 < -3\n"));
    assertEquals(3, calcMSM(3, " 3 < -25% \n 10 < -3 \n"));
    assertEquals(3, calcMSM(4, " 3 < -25% 10 < -3 "));
    assertEquals(4, calcMSM(5, " 3 < -25% 10 < -3"));
    assertEquals(5, calcMSM(6, "3<-25% 10<-3"));
    assertEquals(6, calcMSM(7, " 3 < -25% 10 < -3 "));
    assertEquals(6, calcMSM(8, " 3 < -25% 10 \n < -3\n"));
    assertEquals(7, calcMSM(9, " 3 < -25% 10 < -3 \n"));
    assertEquals(8, calcMSM(10, " 3 < -25% 10 < -3"));
    assertEquals(8, calcMSM(11, "3<-25% 10<-3"));
    assertEquals(9, calcMSM(12, "3<-25% 10<-3"));
    assertEquals(97, calcMSM(100, "3<-25% 10<-3"));

    BooleanQuery q = new BooleanQuery();
    q.add(new TermQuery(new Term("a", "b")), Occur.SHOULD);
    q.add(new TermQuery(new Term("a", "c")), Occur.SHOULD);
    q.add(new TermQuery(new Term("a", "d")), Occur.SHOULD);
    q.add(new TermQuery(new Term("a", "d")), Occur.SHOULD);

    SolrPluginUtils.setMinShouldMatch(q, "0");
    assertEquals(0, q.getMinimumNumberShouldMatch());

    SolrPluginUtils.setMinShouldMatch(q, "1");
    assertEquals(1, q.getMinimumNumberShouldMatch());

    SolrPluginUtils.setMinShouldMatch(q, "50%");
    assertEquals(2, q.getMinimumNumberShouldMatch());

    SolrPluginUtils.setMinShouldMatch(q, "99");
    assertEquals(4, q.getMinimumNumberShouldMatch());

    q.add(new TermQuery(new Term("a", "e")), Occur.MUST);
    q.add(new TermQuery(new Term("a", "f")), Occur.MUST);

    SolrPluginUtils.setMinShouldMatch(q, "50%");
    assertEquals(2, q.getMinimumNumberShouldMatch());

}

From source file:org.elasticsearch.action.debugquery.QueryToMapTransformer.java

License:Apache License

@Override
public Map visit(BooleanQuery query) throws Exception {
    final Map map = newQuery(query);
    map.put("minShouldMatch", query.getMinimumNumberShouldMatch());
    map.put("coordDisabled", query.isCoordDisabled());
    final ArrayList clauses = new ArrayList(query.clauses().size());
    map.put("clauses", clauses);
    for (final BooleanClause clause : query.clauses()) {
        final Object child = QueryAcceptor.accept(clause.getQuery(), this);
        final Map<String, Object> clauseMap = new LinkedHashMap();
        clauses.add(clauseMap);/* ww  w  .  j  a  va 2  s  .  co  m*/
        clauseMap.put("occur", clause.getOccur().name());
        clauseMap.put("query", child);
    }
    return map;
}

From source file:org.elasticsearch.common.lucene.search.Queries.java

License:Apache License

/**
 * Optimizes the given query and returns the optimized version of it.
 *//*  w w w  . ja  va  2s  .c o  m*/
public static Query optimizeQuery(Query q) {
    if (q instanceof BooleanQuery) {
        BooleanQuery booleanQuery = (BooleanQuery) q;
        BooleanClause[] clauses = booleanQuery.getClauses();
        if (clauses.length == 1) {
            BooleanClause clause = clauses[0];
            if (clause.getOccur() == BooleanClause.Occur.MUST) {
                Query query = clause.getQuery();
                query.setBoost(booleanQuery.getBoost() * query.getBoost());
                return optimizeQuery(query);
            }
            if (clause.getOccur() == BooleanClause.Occur.SHOULD
                    && booleanQuery.getMinimumNumberShouldMatch() > 0) {
                Query query = clause.getQuery();
                query.setBoost(booleanQuery.getBoost() * query.getBoost());
                return optimizeQuery(query);
            }
        }
    }
    return q;
}

From source file:org.elasticsearch.index.query.BoolQueryBuilderTests.java

License:Apache License

public void testDefaultMinShouldMatch() throws Exception {
    // Queries have a minShouldMatch of 0
    BooleanQuery bq = (BooleanQuery) parseQuery(boolQuery().must(termQuery("foo", "bar")).buildAsBytes())
            .toQuery(createShardContext());
    assertEquals(0, bq.getMinimumNumberShouldMatch());

    bq = (BooleanQuery) parseQuery(boolQuery().should(termQuery("foo", "bar")).buildAsBytes())
            .toQuery(createShardContext());
    assertEquals(0, bq.getMinimumNumberShouldMatch());

    // Filters have a minShouldMatch of 0/1
    ConstantScoreQuery csq = (ConstantScoreQuery) parseQuery(
            constantScoreQuery(boolQuery().must(termQuery("foo", "bar"))).buildAsBytes())
                    .toQuery(createShardContext());
    bq = (BooleanQuery) csq.getQuery();// w ww. ja va  2s . co m
    assertEquals(0, bq.getMinimumNumberShouldMatch());

    csq = (ConstantScoreQuery) parseQuery(
            constantScoreQuery(boolQuery().should(termQuery("foo", "bar"))).buildAsBytes())
                    .toQuery(createShardContext());
    bq = (BooleanQuery) csq.getQuery();
    assertEquals(1, bq.getMinimumNumberShouldMatch());
}

From source file:org.elasticsearch.index.query.BoolQueryBuilderTests.java

License:Apache License

public void testMinShouldMatchFilterWithoutShouldClauses() throws Exception {
    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    boolQueryBuilder.filter(new BoolQueryBuilder().must(new MatchAllQueryBuilder()));
    Query query = boolQueryBuilder.toQuery(createShardContext());
    assertThat(query, instanceOf(BooleanQuery.class));
    BooleanQuery booleanQuery = (BooleanQuery) query;
    assertThat(booleanQuery.getMinimumNumberShouldMatch(), equalTo(0));
    assertThat(booleanQuery.clauses().size(), equalTo(1));
    BooleanClause booleanClause = booleanQuery.clauses().get(0);
    assertThat(booleanClause.getOccur(), equalTo(BooleanClause.Occur.FILTER));
    assertThat(booleanClause.getQuery(), instanceOf(BooleanQuery.class));
    BooleanQuery innerBooleanQuery = (BooleanQuery) booleanClause.getQuery();
    //we didn't set minimum should match initially, there are no should clauses so it should be 0
    assertThat(innerBooleanQuery.getMinimumNumberShouldMatch(), equalTo(0));
    assertThat(innerBooleanQuery.clauses().size(), equalTo(1));
    BooleanClause innerBooleanClause = innerBooleanQuery.clauses().get(0);
    assertThat(innerBooleanClause.getOccur(), equalTo(BooleanClause.Occur.MUST));
    assertThat(innerBooleanClause.getQuery(), instanceOf(MatchAllDocsQuery.class));
}

From source file:org.elasticsearch.index.query.BoolQueryBuilderTests.java

License:Apache License

public void testMinShouldMatchFilterWithShouldClauses() throws Exception {
    BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    boolQueryBuilder/*  w  ww .j a  va  2 s  . c  o  m*/
            .filter(new BoolQueryBuilder().must(new MatchAllQueryBuilder()).should(new MatchAllQueryBuilder()));
    Query query = boolQueryBuilder.toQuery(createShardContext());
    assertThat(query, instanceOf(BooleanQuery.class));
    BooleanQuery booleanQuery = (BooleanQuery) query;
    assertThat(booleanQuery.getMinimumNumberShouldMatch(), equalTo(0));
    assertThat(booleanQuery.clauses().size(), equalTo(1));
    BooleanClause booleanClause = booleanQuery.clauses().get(0);
    assertThat(booleanClause.getOccur(), equalTo(BooleanClause.Occur.FILTER));
    assertThat(booleanClause.getQuery(), instanceOf(BooleanQuery.class));
    BooleanQuery innerBooleanQuery = (BooleanQuery) booleanClause.getQuery();
    //we didn't set minimum should match initially, but there are should clauses so it should be 1
    assertThat(innerBooleanQuery.getMinimumNumberShouldMatch(), equalTo(1));
    assertThat(innerBooleanQuery.clauses().size(), equalTo(2));
    BooleanClause innerBooleanClause1 = innerBooleanQuery.clauses().get(0);
    assertThat(innerBooleanClause1.getOccur(), equalTo(BooleanClause.Occur.MUST));
    assertThat(innerBooleanClause1.getQuery(), instanceOf(MatchAllDocsQuery.class));
    BooleanClause innerBooleanClause2 = innerBooleanQuery.clauses().get(1);
    assertThat(innerBooleanClause2.getOccur(), equalTo(BooleanClause.Occur.SHOULD));
    assertThat(innerBooleanClause2.getQuery(), instanceOf(MatchAllDocsQuery.class));
}

From source file:org.elasticsearch.index.query.BoolQueryBuilderTests.java

License:Apache License

public void testMinShouldMatchBiggerThanNumberOfShouldClauses() throws Exception {
    BooleanQuery bq = (BooleanQuery) parseQuery(boolQuery().should(termQuery("foo", "bar"))
            .should(termQuery("foo2", "bar2")).minimumNumberShouldMatch("3").buildAsBytes())
                    .toQuery(createShardContext());
    assertEquals(3, bq.getMinimumNumberShouldMatch());

    bq = (BooleanQuery) parseQuery(boolQuery().should(termQuery("foo", "bar")).should(termQuery("foo2", "bar2"))
            .minimumNumberShouldMatch(3).buildAsBytes()).toQuery(createShardContext());
    assertEquals(3, bq.getMinimumNumberShouldMatch());
}