List of usage examples for org.apache.lucene.search BooleanQuery getMinimumNumberShouldMatch
public int getMinimumNumberShouldMatch()
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()); }