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:org.elasticsearch.index.query.BoolQueryBuilderTests.java

License:Apache License

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

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

License:Apache License

@Override
protected void doAssertLuceneQuery(MatchQueryBuilder queryBuilder, Query query, QueryShardContext context)
        throws IOException {
    assertThat(query, notNullValue());/*from w ww  .j  a  v a2s .co  m*/

    if (query instanceof MatchAllDocsQuery) {
        assertThat(queryBuilder.zeroTermsQuery(), equalTo(ZeroTermsQuery.ALL));
        return;
    }

    switch (queryBuilder.type()) {
    case BOOLEAN:
        assertThat(query,
                either(instanceOf(BooleanQuery.class)).or(instanceOf(ExtendedCommonTermsQuery.class))
                        .or(instanceOf(TermQuery.class)).or(instanceOf(FuzzyQuery.class))
                        .or(instanceOf(MatchNoDocsQuery.class)).or(instanceOf(PointRangeQuery.class)));
        break;
    case PHRASE:
        assertThat(query,
                either(instanceOf(BooleanQuery.class)).or(instanceOf(PhraseQuery.class))
                        .or(instanceOf(TermQuery.class)).or(instanceOf(FuzzyQuery.class))
                        .or(instanceOf(PointRangeQuery.class)));
        break;
    case PHRASE_PREFIX:
        assertThat(query,
                either(instanceOf(BooleanQuery.class)).or(instanceOf(MultiPhrasePrefixQuery.class))
                        .or(instanceOf(TermQuery.class)).or(instanceOf(FuzzyQuery.class))
                        .or(instanceOf(PointRangeQuery.class)));
        break;
    }

    MappedFieldType fieldType = context.fieldMapper(queryBuilder.fieldName());
    if (query instanceof TermQuery && fieldType != null) {
        String queryValue = queryBuilder.value().toString();
        if (queryBuilder.analyzer() == null || queryBuilder.analyzer().equals("simple")) {
            queryValue = queryValue.toLowerCase(Locale.ROOT);
        }
        Query expectedTermQuery = fieldType.termQuery(queryValue, context);
        assertEquals(expectedTermQuery, query);
    }

    if (query instanceof BooleanQuery) {
        BooleanQuery bq = (BooleanQuery) query;
        if (queryBuilder.minimumShouldMatch() != null) {
            // calculate expected minimumShouldMatch value
            int optionalClauses = 0;
            for (BooleanClause c : bq.clauses()) {
                if (c.getOccur() == BooleanClause.Occur.SHOULD) {
                    optionalClauses++;
                }
            }
            int msm = Queries.calculateMinShouldMatch(optionalClauses, queryBuilder.minimumShouldMatch());
            assertThat(bq.getMinimumNumberShouldMatch(), equalTo(msm));
        }
        if (queryBuilder.analyzer() == null && queryBuilder.value().toString().length() > 0) {
            assertEquals(bq.clauses().size(), queryBuilder.value().toString().split(" ").length);
        }
    }

    if (query instanceof ExtendedCommonTermsQuery) {
        assertTrue(queryBuilder.cutoffFrequency() != null);
        ExtendedCommonTermsQuery ectq = (ExtendedCommonTermsQuery) query;
        assertEquals(queryBuilder.cutoffFrequency(), ectq.getMaxTermFrequency(), Float.MIN_VALUE);
    }

    if (query instanceof FuzzyQuery) {
        assertTrue(queryBuilder.fuzziness() != null);
        FuzzyQuery fuzzyQuery = (FuzzyQuery) query;
        // depending on analyzer being set or not we can have term lowercased along the way, so to simplify test we just
        // compare lowercased terms here
        String originalTermLc = queryBuilder.value().toString().toLowerCase(Locale.ROOT);
        String actualTermLc = fuzzyQuery.getTerm().text().toLowerCase(Locale.ROOT);
        Matcher<String> termLcMatcher = equalTo(originalTermLc);
        if ("false".equals(originalTermLc) || "true".equals(originalTermLc)) {
            // Booleans become t/f when querying a boolean field
            termLcMatcher = either(termLcMatcher).or(equalTo(originalTermLc.substring(0, 1)));
        }
        assertThat(actualTermLc, termLcMatcher);
        assertThat(queryBuilder.prefixLength(), equalTo(fuzzyQuery.getPrefixLength()));
        assertThat(queryBuilder.fuzzyTranspositions(), equalTo(fuzzyQuery.getTranspositions()));
    }

    if (query instanceof PointRangeQuery) {
        // TODO
    }
}

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

License:Apache License

public void testToQueryBooleanQueryMultipleBoosts() throws Exception {
    assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
    int numBoosts = randomIntBetween(2, 10);
    float[] boosts = new float[numBoosts + 1];
    String queryStringPrefix = "";
    String queryStringSuffix = "";
    for (int i = 0; i < boosts.length - 1; i++) {
        float boost = 2.0f / randomIntBetween(3, 20);
        boosts[i] = boost;//from   w  w w.  j a  v a2  s  . c o m
        queryStringPrefix += "(";
        queryStringSuffix += ")^" + boost;
    }
    String queryString = queryStringPrefix + "foo bar" + queryStringSuffix;

    float mainBoost = 2.0f / randomIntBetween(3, 20);
    boosts[boosts.length - 1] = mainBoost;
    QueryStringQueryBuilder queryStringQueryBuilder = new QueryStringQueryBuilder(queryString)
            .field(STRING_FIELD_NAME).minimumShouldMatch("2").boost(mainBoost);
    Query query = queryStringQueryBuilder.toQuery(createShardContext());

    for (int i = boosts.length - 1; i >= 0; i--) {
        assertThat(query, instanceOf(BoostQuery.class));
        BoostQuery boostQuery = (BoostQuery) query;
        assertThat(boostQuery.getBoost(), equalTo(boosts[i]));
        query = boostQuery.getQuery();
    }

    assertThat(query, instanceOf(BooleanQuery.class));
    BooleanQuery booleanQuery = (BooleanQuery) query;
    assertThat(booleanQuery.getMinimumNumberShouldMatch(), equalTo(2));
    assertThat(booleanQuery.clauses().get(0).getOccur(), equalTo(BooleanClause.Occur.SHOULD));
    assertThat(booleanQuery.clauses().get(0).getQuery(),
            equalTo(new TermQuery(new Term(STRING_FIELD_NAME, "foo"))));
    assertThat(booleanQuery.clauses().get(1).getOccur(), equalTo(BooleanClause.Occur.SHOULD));
    assertThat(booleanQuery.clauses().get(1).getQuery(),
            equalTo(new TermQuery(new Term(STRING_FIELD_NAME, "bar"))));
}

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

License:Apache License

@Override
protected void doAssertLuceneQuery(SimpleQueryStringBuilder queryBuilder, Query query,
        QueryShardContext context) throws IOException {
    assertThat(query, notNullValue());/*from w  w w  .  ja  v a  2s .c  o m*/

    if ("".equals(queryBuilder.value())) {
        assertThat(query, instanceOf(MatchNoDocsQuery.class));
    } else if (queryBuilder.fields().size() > 1) {
        assertThat(query, instanceOf(BooleanQuery.class));
        BooleanQuery boolQuery = (BooleanQuery) query;
        if (queryBuilder.lowercaseExpandedTerms()) {
            for (BooleanClause clause : boolQuery.clauses()) {
                if (clause.getQuery() instanceof TermQuery) {
                    TermQuery inner = (TermQuery) clause.getQuery();
                    assertThat(inner.getTerm().bytes().toString(),
                            is(inner.getTerm().bytes().toString().toLowerCase(Locale.ROOT)));
                }
            }
        }
        assertThat(boolQuery.clauses().size(), equalTo(queryBuilder.fields().size()));
        Iterator<Map.Entry<String, Float>> fieldsIterator = queryBuilder.fields().entrySet().iterator();
        for (BooleanClause booleanClause : boolQuery) {
            Map.Entry<String, Float> field = fieldsIterator.next();
            assertTermOrBoostQuery(booleanClause.getQuery(), field.getKey(), queryBuilder.value(),
                    field.getValue());
        }
        if (queryBuilder.minimumShouldMatch() != null && !boolQuery.isCoordDisabled()) {
            assertThat(boolQuery.getMinimumNumberShouldMatch(), greaterThan(0));
        }
    } else if (queryBuilder.fields().size() == 1) {
        Map.Entry<String, Float> field = queryBuilder.fields().entrySet().iterator().next();
        assertTermOrBoostQuery(query, field.getKey(), queryBuilder.value(), field.getValue());
    } else if (queryBuilder.fields().size() == 0) {
        assertTermQuery(query, MetaData.ALL, queryBuilder.value());
    } else {
        fail("Encountered lucene query type we do not have a validation implementation for in our "
                + SimpleQueryStringBuilderTests.class.getSimpleName());
    }
}

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

License:Apache License

public void testMinimumShouldMatch() throws IOException {
    QueryShardContext shardContext = createShardContext();
    int numberOfTerms = randomIntBetween(1, 4);
    StringBuilder queryString = new StringBuilder();
    for (int i = 0; i < numberOfTerms; i++) {
        queryString.append("t" + i + " ");
    }//from   w  ww .  jav a2s .c o  m
    SimpleQueryStringBuilder simpleQueryStringBuilder = new SimpleQueryStringBuilder(
            queryString.toString().trim());
    if (randomBoolean()) {
        simpleQueryStringBuilder.defaultOperator(Operator.AND);
    }
    int numberOfFields = randomIntBetween(1, 4);
    for (int i = 0; i < numberOfFields; i++) {
        simpleQueryStringBuilder.field("f" + i);
    }
    int percent = randomIntBetween(1, 100);
    simpleQueryStringBuilder.minimumShouldMatch(percent + "%");
    Query query = simpleQueryStringBuilder.toQuery(shardContext);

    // check special case: one term & one field should get simplified to a TermQuery
    if (numberOfFields * numberOfTerms == 1) {
        assertThat(query, instanceOf(TermQuery.class));
    } else {
        assertThat(query, instanceOf(BooleanQuery.class));
        BooleanQuery boolQuery = (BooleanQuery) query;
        int expectedMinimumShouldMatch = numberOfTerms * percent / 100;
        if (numberOfTerms == 1 || simpleQueryStringBuilder.defaultOperator().equals(Operator.AND)) {
            expectedMinimumShouldMatch = 0;
        }
        assertEquals(expectedMinimumShouldMatch, boolQuery.getMinimumNumberShouldMatch());
    }
}

From source file:org.elasticsearch.percolator.ExtractQueryTermsService.java

License:Apache License

static Function<Query, Result> booleanQuery() {
    return query -> {
        BooleanQuery bq = (BooleanQuery) query;
        List<BooleanClause> clauses = bq.clauses();
        int minimumShouldMatch = bq.getMinimumNumberShouldMatch();
        int numRequiredClauses = 0;
        int numOptionalClauses = 0;
        int numProhibitedClauses = 0;
        for (BooleanClause clause : clauses) {
            if (clause.isRequired()) {
                numRequiredClauses++;//w ww . j  a  v a2  s .c o m
            }
            if (clause.isProhibited()) {
                numProhibitedClauses++;
            }
            if (clause.getOccur() == BooleanClause.Occur.SHOULD) {
                numOptionalClauses++;
            }
        }
        if (numRequiredClauses > 0) {
            Set<Term> bestClause = null;
            UnsupportedQueryException uqe = null;
            for (BooleanClause clause : clauses) {
                if (clause.isRequired() == false) {
                    // skip must_not clauses, we don't need to remember the things that do *not* match...
                    // skip should clauses, this bq has must clauses, so we don't need to remember should clauses,
                    // since they are completely optional.
                    continue;
                }

                Result temp;
                try {
                    temp = extractQueryTerms(clause.getQuery());
                } catch (UnsupportedQueryException e) {
                    uqe = e;
                    continue;
                }
                bestClause = selectTermListWithTheLongestShortestTerm(temp.terms, bestClause);
            }
            if (bestClause != null) {
                return new Result(false, bestClause);
            } else {
                if (uqe != null) {
                    // we're unable to select the best clause and an exception occurred, so we bail
                    throw uqe;
                } else {
                    // We didn't find a clause and no exception occurred, so this bq only contained MatchNoDocsQueries,
                    return new Result(true, Collections.emptySet());
                }
            }
        } else {
            List<Query> disjunctions = new ArrayList<>(numOptionalClauses);
            for (BooleanClause clause : clauses) {
                if (clause.getOccur() == BooleanClause.Occur.SHOULD) {
                    disjunctions.add(clause.getQuery());
                }
            }
            return handleDisjunction(disjunctions, minimumShouldMatch, numProhibitedClauses > 0);
        }
    };
}

From source file:org.elasticsearch.percolator.QueryAnalyzer.java

License:Apache License

static Function<Query, Result> booleanQuery() {
    return query -> {
        BooleanQuery bq = (BooleanQuery) query;
        List<BooleanClause> clauses = bq.clauses();
        int minimumShouldMatch = bq.getMinimumNumberShouldMatch();
        int numRequiredClauses = 0;
        int numOptionalClauses = 0;
        int numProhibitedClauses = 0;
        for (BooleanClause clause : clauses) {
            if (clause.isRequired()) {
                numRequiredClauses++;//from  ww  w. j  a v a 2  s.  c  om
            }
            if (clause.isProhibited()) {
                numProhibitedClauses++;
            }
            if (clause.getOccur() == BooleanClause.Occur.SHOULD) {
                numOptionalClauses++;
            }
        }
        if (numRequiredClauses > 0) {
            Set<Term> bestClause = null;
            UnsupportedQueryException uqe = null;
            for (BooleanClause clause : clauses) {
                if (clause.isRequired() == false) {
                    // skip must_not clauses, we don't need to remember the things that do *not* match...
                    // skip should clauses, this bq has must clauses, so we don't need to remember should clauses,
                    // since they are completely optional.
                    continue;
                }

                Result temp;
                try {
                    temp = analyze(clause.getQuery());
                } catch (UnsupportedQueryException e) {
                    uqe = e;
                    continue;
                }
                bestClause = selectTermListWithTheLongestShortestTerm(temp.terms, bestClause);
            }
            if (bestClause != null) {
                return new Result(false, bestClause);
            } else {
                if (uqe != null) {
                    // we're unable to select the best clause and an exception occurred, so we bail
                    throw uqe;
                } else {
                    // We didn't find a clause and no exception occurred, so this bq only contained MatchNoDocsQueries,
                    return new Result(true, Collections.emptySet());
                }
            }
        } else {
            List<Query> disjunctions = new ArrayList<>(numOptionalClauses);
            for (BooleanClause clause : clauses) {
                if (clause.getOccur() == BooleanClause.Occur.SHOULD) {
                    disjunctions.add(clause.getQuery());
                }
            }
            return handleDisjunction(disjunctions, minimumShouldMatch, numProhibitedClauses > 0);
        }
    };
}

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

License:Apache License

public static BooleanQuery optimizeBooleanQuery(BooleanQuery q) {
    BooleanQuery optimized = new BooleanQuery(q.isCoordDisabled());
    optimized.setMinimumNumberShouldMatch(q.getMinimumNumberShouldMatch());
    optimizeBooleanQuery(optimized, q);/*  ww  w  .j  a  va2 s .c om*/
    return optimized;
}

From source file:org.eu.bitzone.Leia.java

License:Apache License

private void _explainStructure(final Object parent, final Query q) {
    String clazz = q.getClass().getName();
    if (clazz.startsWith("org.apache.lucene.")) {
        clazz = "lucene." + q.getClass().getSimpleName();
    } else if (clazz.startsWith("org.apache.solr.")) {
        clazz = "solr." + q.getClass().getSimpleName();
    }/*w ww .jav  a  2 s  .  c  om*/
    final float boost = q.getBoost();
    final Object n = create("node");
    add(parent, n);
    String msg = clazz;
    if (boost != 1.0f) {
        msg += ": boost=" + df.format(boost);
    }
    setFont(n, getFont().deriveFont(Font.BOLD));
    setString(n, "text", msg);
    if (clazz.equals("lucene.TermQuery")) {
        final Object n1 = create("node");
        final Term t = ((TermQuery) q).getTerm();
        setString(n1, "text", "Term: field='" + t.field() + "' text='" + t.text() + "'");
        add(n, n1);
    } else if (clazz.equals("lucene.BooleanQuery")) {
        final BooleanQuery bq = (BooleanQuery) q;
        final BooleanClause[] clauses = bq.getClauses();
        final int max = BooleanQuery.getMaxClauseCount();
        Object n1 = create("node");
        String descr = "clauses=" + clauses.length + ", maxClauses=" + max;
        if (bq.isCoordDisabled()) {
            descr += ", coord=false";
        }
        if (bq.getMinimumNumberShouldMatch() > 0) {
            descr += ", minShouldMatch=" + bq.getMinimumNumberShouldMatch();
        }
        setString(n1, "text", descr);
        add(n, n1);
        for (int i = 0; i < clauses.length; i++) {
            n1 = create("node");
            String occur;
            final Occur occ = clauses[i].getOccur();
            if (occ.equals(Occur.MUST)) {
                occur = "MUST";
            } else if (occ.equals(Occur.MUST_NOT)) {
                occur = "MUST_NOT";
            } else if (occ.equals(Occur.SHOULD)) {
                occur = "SHOULD";
            } else {
                occur = occ.toString();
            }
            setString(n1, "text", "Clause " + i + ": " + occur);
            add(n, n1);
            _explainStructure(n1, clauses[i].getQuery());
        }
    } else if (clazz.equals("lucene.PrefixQuery")) {
        Object n1 = create("node");
        final PrefixQuery pq = (PrefixQuery) q;
        final Term t = pq.getPrefix();
        setString(n1, "text", "Prefix: field='" + t.field() + "' text='" + t.text() + "'");
        add(n, n1);
        try {
            addTermsEnum(n, PrefixQuery.class, pq.getField(), pq);
        } catch (final Exception e) {
            e.printStackTrace();
            n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (clazz.equals("lucene.PhraseQuery")) {
        final PhraseQuery pq = (PhraseQuery) q;
        setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop());
        final int[] pos = pq.getPositions();
        final Term[] terms = pq.getTerms();
        Object n1 = create("node");
        final StringBuffer sb = new StringBuffer("pos: [");
        for (int i = 0; i < pos.length; i++) {
            if (i > 0) {
                sb.append(',');
            }
            sb.append("" + pos[i]);
        }
        sb.append("]");
        setString(n1, "text", sb.toString());
        add(n, n1);
        for (int i = 0; i < terms.length; i++) {
            n1 = create("node");
            setString(n1, "text",
                    "Term " + i + ": field='" + terms[i].field() + "' text='" + terms[i].text() + "'");
            add(n, n1);
        }
    } else if (clazz.equals("lucene.MultiPhraseQuery")) {
        final MultiPhraseQuery pq = (MultiPhraseQuery) q;
        setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop());
        final int[] pos = pq.getPositions();
        Object n1 = create("node");
        final StringBuffer sb = new StringBuffer("pos: [");
        for (int i = 0; i < pos.length; i++) {
            if (i > 0) {
                sb.append(',');
            }
            sb.append("" + pos[i]);
        }
        sb.append("]");
        setString(n1, "text", sb.toString());
        add(n, n1);
        n1 = create("node");
        System.err.println("MultiPhraseQuery is missing the public getTermArrays() :-(");
        setString(n1, "text", "toString: " + pq.toString());
        add(n, n1);
    } else if (clazz.equals("lucene.FuzzyQuery")) {
        final FuzzyQuery fq = (FuzzyQuery) q;
        Object n1 = create("node");
        setString(n1, "text", "field=" + fq.getField() + ", prefixLen=" + fq.getPrefixLength() + ", maxEdits="
                + df.format(fq.getMaxEdits()));
        add(n, n1);
        try {
            addTermsEnum(n, FuzzyQuery.class, fq.getField(), fq);
        } catch (final Exception e) {
            e.printStackTrace();
            n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (clazz.equals("lucene.WildcardQuery")) {
        final WildcardQuery wq = (WildcardQuery) q;
        final Term t = wq.getTerm();
        setString(n, "text", getString(n, "text") + ", term=" + t);
        final Automaton a = WildcardQuery.toAutomaton(t);
        addAutomaton(n, a);
    } else if (clazz.equals("lucene.TermRangeQuery")) {
        final TermRangeQuery rq = (TermRangeQuery) q;
        setString(n, "text", getString(n, "text") + ", inclLower=" + rq.includesLower() + ", inclUpper="
                + rq.includesUpper());
        Object n1 = create("node");
        setString(n1, "text", "lowerTerm=" + rq.getField() + ":" + rq.getLowerTerm() + "'");
        add(n, n1);
        n1 = create("node");
        setString(n1, "text", "upperTerm=" + rq.getField() + ":" + rq.getUpperTerm() + "'");
        add(n, n1);
        try {
            addTermsEnum(n, TermRangeQuery.class, rq.getField(), rq);
        } catch (final Exception e) {
            e.printStackTrace();
            n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (q instanceof AutomatonQuery) {
        final AutomatonQuery aq = (AutomatonQuery) q;
        setString(n, "text", getString(n, "text") + ", " + aq.toString());
        // get automaton
        try {
            final java.lang.reflect.Field aField = AutomatonQuery.class.getDeclaredField("automaton");
            aField.setAccessible(true);
            final Automaton a = (Automaton) aField.get(aq);
            addAutomaton(n, a);
        } catch (final Exception e) {
            e.printStackTrace();
            final Object n1 = create("node");
            setString(n1, "text", "Automaton: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (q instanceof MultiTermQuery) {
        final MultiTermQuery mq = (MultiTermQuery) q;
        final Set<Term> terms = new HashSet<Term>();
        mq.extractTerms(terms);
        setString(n, "text", getString(n, "text") + ", terms: " + terms);
        try {
            addTermsEnum(n, TermRangeQuery.class, mq.getField(), mq);
        } catch (final Exception e) {
            e.printStackTrace();
            final Object n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (q instanceof ConstantScoreQuery) {
        final ConstantScoreQuery cq = (ConstantScoreQuery) q;
        setString(n, "text", getString(n, "text") + ", " + cq.toString());
        final Object n1 = create("node");
        add(n, n1);
        if (cq.getFilter() != null) {
            setString(n1, "text", "Filter: " + cq.getFilter().toString());
        } else if (cq.getQuery() != null) {
            _explainStructure(n, cq.getQuery());
        }
    } else if (q instanceof FilteredQuery) {
        final FilteredQuery fq = (FilteredQuery) q;
        final Object n1 = create("node");
        setString(n1, "text", "Filter: " + fq.getFilter().toString());
        add(n, n1);
        _explainStructure(n, fq.getQuery());
    } else if (q instanceof SpanQuery) {
        final SpanQuery sq = (SpanQuery) q;
        final Class sqlass = sq.getClass();
        setString(n, "text", getString(n, "text") + ", field=" + sq.getField());
        if (sqlass == SpanOrQuery.class) {
            final SpanOrQuery soq = (SpanOrQuery) sq;
            setString(n, "text", getString(n, "text") + ", " + soq.getClauses().length + " clauses");
            for (final SpanQuery sq1 : soq.getClauses()) {
                _explainStructure(n, sq1);
            }
        } else if (sqlass == SpanFirstQuery.class) {
            final SpanFirstQuery sfq = (SpanFirstQuery) sq;
            setString(n, "text", getString(n, "text") + ", end=" + sfq.getEnd() + ", match:");
            _explainStructure(n, sfq.getMatch());
        } else if (q instanceof SpanNearQuery) { // catch also known subclasses
            final SpanNearQuery snq = (SpanNearQuery) sq;
            setString(n, "text", getString(n, "text") + ", slop=" + snq.getSlop());
            if (snq instanceof PayloadNearQuery) {
                try {
                    final java.lang.reflect.Field function = PayloadNearQuery.class
                            .getDeclaredField("function");
                    function.setAccessible(true);
                    final Object func = function.get(snq);
                    setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName());
                } catch (final Exception e) {
                    e.printStackTrace();
                }
            }
            for (final SpanQuery sq1 : snq.getClauses()) {
                _explainStructure(n, sq1);
            }
        } else if (sqlass == SpanNotQuery.class) {
            final SpanNotQuery snq = (SpanNotQuery) sq;
            Object n1 = create("node");
            add(n, n1);
            setString(n1, "text", "Include:");
            _explainStructure(n1, snq.getInclude());
            n1 = create("node");
            add(n, n1);
            setString(n1, "text", "Exclude:");
            _explainStructure(n1, snq.getExclude());
        } else if (q instanceof SpanTermQuery) {
            final SpanTermQuery stq = (SpanTermQuery) sq;
            setString(n, "text", getString(n, "text") + ", term=" + stq.getTerm());
            if (stq instanceof PayloadTermQuery) {
                try {
                    final java.lang.reflect.Field function = PayloadTermQuery.class
                            .getDeclaredField("function");
                    function.setAccessible(true);
                    final Object func = function.get(stq);
                    setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName());
                } catch (final Exception e) {
                    e.printStackTrace();
                }
            }
        } else {
            final String defField = getDefaultField(find("srchOptTabs"));
            setString(n, "text", "class=" + q.getClass().getName() + ", " + getString(n, "text") + ", toString="
                    + q.toString(defField));
            final HashSet<Term> terms = new HashSet<Term>();
            sq.extractTerms(terms);
            Object n1 = null;
            if (terms != null) {
                n1 = create("node");
                setString(n1, "text", "Matched terms (" + terms.size() + "):");
                add(n, n1);
                final Iterator<Term> it = terms.iterator();
                while (it.hasNext()) {
                    final Object n2 = create("node");
                    final Term t = it.next();
                    setString(n2, "text", "field='" + t.field() + "' text='" + t.text() + "'");
                    add(n1, n2);
                }
            } else {
                n1 = create("node");
                setString(n1, "text", "<no terms matched>");
                add(n, n1);
            }
        }
        if (ir != null) {
            final Object n1 = null;
            /*
             * in Lucene 4.0 this requires traversal of sub- and leaf readers, which is cumbersome to do here. try { Spans
             * spans = sq.getSpans(ir); if (spans != null) { n1 = create("node"); int cnt = 0; while (spans.next()) { Object
             * n2 = create("node"); setString(n2, "text", "doc=" + spans.doc() + ", start=" + spans.start() + ", end=" +
             * spans.end()); add(n1, n2); cnt++; } if (cnt > 0) { add(n, n1); setString(n1, "text", "Spans (" + cnt + "):");
             * setBoolean(n1, "expanded", false); } } } catch (Exception e) { e.printStackTrace(); n1 = create("node");
             * setString(n1, "text", "Spans Exception: " + e.getMessage()); add(n, n1); }
             */
        }
    } else {
        Object n1 = create("node");
        final String defField = getDefaultField(find("srchOptTabs"));
        final Set<Term> terms = new HashSet<Term>();
        q.extractTerms(terms);
        setString(n1, "text", q.getClass().getName() + ": " + q.toString(defField));
        add(n, n1);
        if (!terms.isEmpty()) {
            n1 = create("node");
            setString(n1, "text", "terms: " + terms);
            add(n, n1);
        }
    }
}

From source file:org.getopt.luke.Luke.java

License:Apache License

private void _explainStructure(Object parent, Query q) {
    String clazz = q.getClass().getName();
    if (clazz.startsWith("org.apache.lucene.")) {
        clazz = "lucene." + q.getClass().getSimpleName();
    } else if (clazz.startsWith("org.apache.solr.")) {
        clazz = "solr." + q.getClass().getSimpleName();
    }//from  w w  w  .j av  a 2 s.c  o  m
    float boost = q.getBoost();
    Object n = create("node");
    add(parent, n);
    String msg = clazz;
    if (boost != 1.0f) {
        msg += ": boost=" + df.format(boost);
    }
    setFont(n, getFont().deriveFont(Font.BOLD));
    setString(n, "text", msg);
    if (clazz.equals("lucene.TermQuery")) {
        Object n1 = create("node");
        Term t = ((TermQuery) q).getTerm();
        setString(n1, "text", "Term: field='" + t.field() + "' text='" + t.text() + "'");
        add(n, n1);
    } else if (clazz.equals("lucene.BooleanQuery")) {
        BooleanQuery bq = (BooleanQuery) q;
        BooleanClause[] clauses = bq.getClauses();
        int max = bq.getMaxClauseCount();
        Object n1 = create("node");
        String descr = "clauses=" + clauses.length + ", maxClauses=" + max;
        if (bq.isCoordDisabled()) {
            descr += ", coord=false";
        }
        if (bq.getMinimumNumberShouldMatch() > 0) {
            descr += ", minShouldMatch=" + bq.getMinimumNumberShouldMatch();
        }
        setString(n1, "text", descr);
        add(n, n1);
        for (int i = 0; i < clauses.length; i++) {
            n1 = create("node");
            String occur;
            Occur occ = clauses[i].getOccur();
            if (occ.equals(Occur.MUST)) {
                occur = "MUST";
            } else if (occ.equals(Occur.MUST_NOT)) {
                occur = "MUST_NOT";
            } else if (occ.equals(Occur.SHOULD)) {
                occur = "SHOULD";
            } else {
                occur = occ.toString();
            }
            setString(n1, "text", "Clause " + i + ": " + occur);
            add(n, n1);
            _explainStructure(n1, clauses[i].getQuery());
        }
    } else if (clazz.equals("lucene.PrefixQuery")) {
        Object n1 = create("node");
        PrefixQuery pq = (PrefixQuery) q;
        Term t = pq.getPrefix();
        setString(n1, "text", "Prefix: field='" + t.field() + "' text='" + t.text() + "'");
        add(n, n1);
        try {
            addTermsEnum(n, PrefixQuery.class, pq.getField(), pq);
        } catch (Exception e) {
            e.printStackTrace();
            n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (clazz.equals("lucene.PhraseQuery")) {
        PhraseQuery pq = (PhraseQuery) q;
        setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop());
        int[] pos = pq.getPositions();
        Term[] terms = pq.getTerms();
        Object n1 = create("node");
        StringBuffer sb = new StringBuffer("pos: [");
        for (int i = 0; i < pos.length; i++) {
            if (i > 0)
                sb.append(',');
            sb.append("" + pos[i]);
        }
        sb.append("]");
        setString(n1, "text", sb.toString());
        add(n, n1);
        for (int i = 0; i < terms.length; i++) {
            n1 = create("node");
            setString(n1, "text",
                    "Term " + i + ": field='" + terms[i].field() + "' text='" + terms[i].text() + "'");
            add(n, n1);
        }
    } else if (clazz.equals("lucene.MultiPhraseQuery")) {
        MultiPhraseQuery pq = (MultiPhraseQuery) q;
        setString(n, "text", getString(n, "text") + ", slop=" + pq.getSlop());
        int[] pos = pq.getPositions();
        Object n1 = create("node");
        StringBuffer sb = new StringBuffer("pos: [");
        for (int i = 0; i < pos.length; i++) {
            if (i > 0)
                sb.append(',');
            sb.append("" + pos[i]);
        }
        sb.append("]");
        setString(n1, "text", sb.toString());
        add(n, n1);
        n1 = create("node");
        System.err.println("MultiPhraseQuery is missing the public getTermArrays() :-(");
        setString(n1, "text", "toString: " + pq.toString());
        add(n, n1);
    } else if (clazz.equals("lucene.FuzzyQuery")) {
        FuzzyQuery fq = (FuzzyQuery) q;
        Object n1 = create("node");
        setString(n1, "text", "field=" + fq.getField() + ", prefixLen=" + fq.getPrefixLength() + ", maxEdits="
                + df.format(fq.getMaxEdits()));
        add(n, n1);
        try {
            addTermsEnum(n, FuzzyQuery.class, fq.getField(), fq);
        } catch (Exception e) {
            e.printStackTrace();
            n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (clazz.equals("lucene.WildcardQuery")) {
        WildcardQuery wq = (WildcardQuery) q;
        Term t = wq.getTerm();
        setString(n, "text", getString(n, "text") + ", term=" + t);
        Automaton a = WildcardQuery.toAutomaton(t);
        addAutomaton(n, a);
    } else if (clazz.equals("lucene.TermRangeQuery")) {
        TermRangeQuery rq = (TermRangeQuery) q;
        setString(n, "text", getString(n, "text") + ", inclLower=" + rq.includesLower() + ", inclUpper="
                + rq.includesUpper());
        Object n1 = create("node");
        setString(n1, "text", "lowerTerm=" + rq.getField() + ":" + rq.getLowerTerm() + "'");
        add(n, n1);
        n1 = create("node");
        setString(n1, "text", "upperTerm=" + rq.getField() + ":" + rq.getUpperTerm() + "'");
        add(n, n1);
        try {
            addTermsEnum(n, TermRangeQuery.class, rq.getField(), rq);
        } catch (Exception e) {
            e.printStackTrace();
            n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (q instanceof AutomatonQuery) {
        AutomatonQuery aq = (AutomatonQuery) q;
        setString(n, "text", getString(n, "text") + ", " + aq.toString());
        // get automaton
        try {
            java.lang.reflect.Field aField = AutomatonQuery.class.getDeclaredField("automaton");
            aField.setAccessible(true);
            Automaton a = (Automaton) aField.get(aq);
            addAutomaton(n, a);
        } catch (Exception e) {
            e.printStackTrace();
            Object n1 = create("node");
            setString(n1, "text", "Automaton: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (q instanceof MultiTermQuery) {
        MultiTermQuery mq = (MultiTermQuery) q;
        Set<Term> terms = new HashSet<Term>();
        mq.extractTerms(terms);
        setString(n, "text", getString(n, "text") + ", terms: " + terms);
        try {
            addTermsEnum(n, TermRangeQuery.class, mq.getField(), mq);
        } catch (Exception e) {
            e.printStackTrace();
            Object n1 = create("node");
            setString(n1, "text", "TermEnum: Exception " + e.getMessage());
            add(n, n1);
        }
    } else if (q instanceof ConstantScoreQuery) {
        ConstantScoreQuery cq = (ConstantScoreQuery) q;
        setString(n, "text", getString(n, "text") + ", " + cq.toString());
        Object n1 = create("node");
        add(n, n1);
        if (cq.getFilter() != null) {
            setString(n1, "text", "Filter: " + cq.getFilter().toString());
        } else if (cq.getQuery() != null) {
            _explainStructure(n, cq.getQuery());
        }
    } else if (q instanceof FilteredQuery) {
        FilteredQuery fq = (FilteredQuery) q;
        Object n1 = create("node");
        setString(n1, "text", "Filter: " + fq.getFilter().toString());
        add(n, n1);
        _explainStructure(n, fq.getQuery());
    } else if (q instanceof SpanQuery) {
        SpanQuery sq = (SpanQuery) q;
        Class sqlass = sq.getClass();
        setString(n, "text", getString(n, "text") + ", field=" + sq.getField());
        if (sqlass == SpanOrQuery.class) {
            SpanOrQuery soq = (SpanOrQuery) sq;
            setString(n, "text", getString(n, "text") + ", " + soq.getClauses().length + " clauses");
            for (SpanQuery sq1 : soq.getClauses()) {
                _explainStructure(n, sq1);
            }
        } else if (sqlass == SpanFirstQuery.class) {
            SpanFirstQuery sfq = (SpanFirstQuery) sq;
            setString(n, "text", getString(n, "text") + ", end=" + sfq.getEnd() + ", match:");
            _explainStructure(n, sfq.getMatch());
        } else if (q instanceof SpanNearQuery) { // catch also known subclasses
            SpanNearQuery snq = (SpanNearQuery) sq;
            setString(n, "text", getString(n, "text") + ", slop=" + snq.getSlop());
            if (snq instanceof PayloadNearQuery) {
                try {
                    java.lang.reflect.Field function = PayloadNearQuery.class.getDeclaredField("function");
                    function.setAccessible(true);
                    Object func = function.get(snq);
                    setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            for (SpanQuery sq1 : snq.getClauses()) {
                _explainStructure(n, sq1);
            }
        } else if (sqlass == SpanNotQuery.class) {
            SpanNotQuery snq = (SpanNotQuery) sq;
            Object n1 = create("node");
            add(n, n1);
            setString(n1, "text", "Include:");
            _explainStructure(n1, snq.getInclude());
            n1 = create("node");
            add(n, n1);
            setString(n1, "text", "Exclude:");
            _explainStructure(n1, snq.getExclude());
        } else if (q instanceof SpanTermQuery) {
            SpanTermQuery stq = (SpanTermQuery) sq;
            setString(n, "text", getString(n, "text") + ", term=" + stq.getTerm());
            if (stq instanceof PayloadTermQuery) {
                try {
                    java.lang.reflect.Field function = PayloadTermQuery.class.getDeclaredField("function");
                    function.setAccessible(true);
                    Object func = function.get(stq);
                    setString(n, "text", getString(n, "text") + ", func=" + func.getClass().getSimpleName());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        } else {
            String defField = getDefaultField(find("srchOptTabs"));
            setString(n, "text", "class=" + q.getClass().getName() + ", " + getString(n, "text") + ", toString="
                    + q.toString(defField));
            HashSet<Term> terms = new HashSet<Term>();
            sq.extractTerms(terms);
            Object n1 = null;
            if (terms != null) {
                n1 = create("node");
                setString(n1, "text", "Matched terms (" + terms.size() + "):");
                add(n, n1);
                Iterator<Term> it = terms.iterator();
                while (it.hasNext()) {
                    Object n2 = create("node");
                    Term t = it.next();
                    setString(n2, "text", "field='" + t.field() + "' text='" + t.text() + "'");
                    add(n1, n2);
                }
            } else {
                n1 = create("node");
                setString(n1, "text", "<no terms matched>");
                add(n, n1);
            }
        }
        if (ir != null) {
            Object n1 = null;
            /* in Lucene 4.0 this requires traversal of sub- and leaf readers,
             * which is cumbersome to do here.
            try {
              Spans spans = sq.getSpans(ir);
              if (spans != null) {
                n1 = create("node");
                int cnt = 0;
                while (spans.next()) {
                  Object n2 = create("node");
                  setString(n2, "text", "doc=" + spans.doc() +
              ", start=" + spans.start() + ", end=" + spans.end());
                  add(n1, n2);
                  cnt++;
                }
                if (cnt > 0) {
                  add(n, n1);
                  setString(n1, "text", "Spans (" + cnt + "):");
                  setBoolean(n1, "expanded", false);
                }
              }
            } catch (Exception e) {
              e.printStackTrace();
              n1 = create("node");
              setString(n1, "text", "Spans Exception: " + e.getMessage());
              add(n, n1);
            }
            */
        }
    } else {
        Object n1 = create("node");
        String defField = getDefaultField(find("srchOptTabs"));
        Set<Term> terms = new HashSet<Term>();
        q.extractTerms(terms);
        setString(n1, "text", q.getClass().getName() + ": " + q.toString(defField));
        add(n, n1);
        if (!terms.isEmpty()) {
            n1 = create("node");
            setString(n1, "text", "terms: " + terms);
            add(n, n1);
        }
    }
}