List of usage examples for org.apache.lucene.search DisjunctionMaxQuery getDisjuncts
public List<Query> getDisjuncts()
From source file:com.xiaomi.linden.core.TestLindenCore.java
License:Apache License
@Test public void testBoosts() throws Exception { String bql = "select * from linden by title = \"lucene\" and field1 = \"aaa\" boost by 2"; LindenSearchRequest request = bqlCompiler.compile(bql).getSearchRequest(); Query query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof BooleanQuery); Assert.assertEquals(2f, query.getBoost(), DELTA5); bql = "select * from linden by title = \"lucene\" boost by 3"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof TermQuery); Assert.assertEquals(3f, query.getBoost(), DELTA5); bql = "select * from linden by Query is 'title:lucene' subBoost by 4 or tagstr = 'MI4'"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof BooleanQuery); BooleanQuery booleanQuery = (BooleanQuery) query; Assert.assertEquals(4f, booleanQuery.clauses().get(0).getQuery().getBoost(), DELTA5); Assert.assertEquals(1f, booleanQuery.clauses().get(1).getQuery().getBoost(), DELTA5); request = bqlCompiler.compile(bql).getSearchRequest(); LindenResult result = lindenCore.search(request); Assert.assertEquals(5, result.getHitsSize()); Assert.assertEquals("1", result.getHits().get(0).getId()); bql = "select * from linden by Query is 'title:lucene' subBoost by 4 or tagstr = 'MI4' subBoost by 2"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof BooleanQuery); booleanQuery = (BooleanQuery) query; Assert.assertEquals(4f, booleanQuery.clauses().get(0).getQuery().getBoost(), DELTA5); Assert.assertEquals(2f, booleanQuery.clauses().get(1).getQuery().getBoost(), DELTA5); request = bqlCompiler.compile(bql).getSearchRequest(); result = lindenCore.search(request); Assert.assertEquals(5, result.getHitsSize()); Assert.assertEquals("6", result.getHits().get(0).getId()); bql = "select * from linden by rank > 4 subBoost by 4 or tagstr = 'MI4'"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof BooleanQuery); booleanQuery = (BooleanQuery) query; Assert.assertEquals(4f, booleanQuery.clauses().get(0).getQuery().getBoost(), DELTA5); Assert.assertEquals(1f, booleanQuery.clauses().get(1).getQuery().getBoost(), DELTA5); request = bqlCompiler.compile(bql).getSearchRequest(); result = lindenCore.search(request); Assert.assertEquals(4, result.getHitsSize()); Assert.assertEquals("2", result.getHits().get(0).getId()); bql = "select * from linden by rank > 4 subBoost by 4 or tagstr = 'MI4' subBoost by 2.0"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof BooleanQuery); booleanQuery = (BooleanQuery) query; Assert.assertEquals(4f, booleanQuery.clauses().get(0).getQuery().getBoost(), DELTA5); Assert.assertEquals(2f, booleanQuery.clauses().get(1).getQuery().getBoost(), DELTA5); request = bqlCompiler.compile(bql).getSearchRequest(); result = lindenCore.search(request); Assert.assertEquals(4, result.getHitsSize()); Assert.assertEquals("6", result.getHits().get(0).getId()); // this boolean query case, does not support term query boost bql = "select * from linden by title = \"lucene\" and field1 = \"aaa\" boost by 2" + "|select * from linden by title = \"lucene\" boost by 3"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof DisjunctionMaxQuery); DisjunctionMaxQuery disjunctionMaxQuery = (DisjunctionMaxQuery) query; Assert.assertEquals(2f, disjunctionMaxQuery.getDisjuncts().get(0).getBoost(), DELTA5); Assert.assertEquals(3f, disjunctionMaxQuery.getDisjuncts().get(1).getBoost(), DELTA5); Assert.assertEquals("(((+title:lucene +field1:aaa)^2.0) | title:lucene^3.0)~0.1", query.toString()); bql = "select * from linden by query is \"title:(lucene test)^2\" where rank > 1 boost by 2"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof BooleanQuery); Assert.assertEquals("(title:lucene title:test)^4.0", query.toString()); bql = "select * from linden by flexible_query is \"lucene test\" in (title)\n" + "using model test(Float m = 10)\n" + "begin\n" + " return score();\n" + "end where rank > 1 source explain boost by 2"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertEquals("FlexibleQuery([title]:[lucene,test])^2.0", query.toString()); bql = "select * from linden by query is \"title:lucene^2\" where rank > 1 order by rank, field1 desc source boost by 2" + "|select * from linden by query is \"title:test^3 field1:aaa\" where rank > 1 order by rank, field1 desc source boost by 0.03"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof DisjunctionMaxQuery); disjunctionMaxQuery = (DisjunctionMaxQuery) query; // subQuery 1 is filterQuery which contains a termQuery Assert.assertTrue(disjunctionMaxQuery.getDisjuncts().get(0) instanceof FilteredQuery); FilteredQuery filteredQuery = (FilteredQuery) disjunctionMaxQuery.getDisjuncts().get(0); Assert.assertTrue(filteredQuery.getQuery() instanceof TermQuery); Assert.assertEquals(4f, filteredQuery.getQuery().getBoost(), DELTA5); // subQuery 2 is filterQuery which contains a booleanQuery Assert.assertTrue(disjunctionMaxQuery.getDisjuncts().get(1) instanceof FilteredQuery); filteredQuery = (FilteredQuery) disjunctionMaxQuery.getDisjuncts().get(1); Assert.assertTrue(filteredQuery.getQuery() instanceof BooleanQuery); Assert.assertEquals(0.03f, filteredQuery.getQuery().getBoost(), DELTA5); Assert.assertEquals(/*from ww w.j av a 2 s . c om*/ "(filtered(title:lucene^4.0)->rank:{1.0 TO *} | filtered((title:test^3.0 field1:aaa)^0.03)->rank:{1.0 TO *})~0.1", query.toString()); // test FlexibleQuery bql = "select * from linden by flexible_query is \"lucene\" in (title)\n" + "using model test(Float m = 10)\n" + "begin\n" + " float sum = 0f;\n" + " for (int i = 0; i < getFieldLength(); ++i) {\n" + " for (int j = 0; j < getTermLength(); ++j) {\n" + " sum += 10 * getScore(i, j);\n" + " addTermExpl(i, j, 10, getExpl(\"[%.2f]\", sum));\n" + " }\n" + " addFieldExpl(i, 20, getExpl(\"[%.2f]\", sum * m));\n" + " }\n" + " return sum * m;\n" + "end where rank > 1 source explain"; bql = bql + "|select * from linden by flexible_query is \"test^3\" in (field1)\n" + "using model test(Float m = 10)\n" + "begin\n" + " float sum = 0f;\n" + " for (int i = 0; i < getFieldLength(); ++i) {\n" + " for (int j = 0; j < getTermLength(); ++j) {\n" + " sum += 10 * getScore(i, j);\n" + " addTermExpl(i, j, 10, getExpl(\"[%.2f]\", sum));\n" + " }\n" + " addFieldExpl(i, 20, getExpl(\"[%.2f]\", sum * m));\n" + " }\n" + " return sum * m;\n" + "end where rank > 1 source explain boost by 0.5"; request = bqlCompiler.compile(bql).getSearchRequest(); query = QueryConstructor.constructQuery(request.getQuery(), lindenConfig); Assert.assertTrue(query instanceof DisjunctionMaxQuery); disjunctionMaxQuery = (DisjunctionMaxQuery) query; // subQuery 1 is a FilteredQuery which contains a FlexibleQuery Assert.assertTrue(disjunctionMaxQuery.getDisjuncts().get(0) instanceof FilteredQuery); filteredQuery = (FilteredQuery) disjunctionMaxQuery.getDisjuncts().get(0); Assert.assertTrue(filteredQuery.getQuery() instanceof FlexibleQuery); Assert.assertEquals(1f, filteredQuery.getQuery().getBoost(), DELTA5); // subQuery 2 is a FilteredQuery which contains a FlexibleQuery Assert.assertTrue(disjunctionMaxQuery.getDisjuncts().get(1) instanceof FilteredQuery); filteredQuery = (FilteredQuery) disjunctionMaxQuery.getDisjuncts().get(1); Assert.assertTrue(filteredQuery.getQuery() instanceof FlexibleQuery); Assert.assertEquals(0.5f, filteredQuery.getQuery().getBoost(), DELTA5); Assert.assertEquals( "(filtered(FlexibleQuery([title]:[lucene]))->rank:{1.0 TO *} | filtered(FlexibleQuery([field1]:[test^3.0])^0.5)->rank:{1.0 TO *})~0.1", query.toString()); }
From source file:org.apache.solr.search.TestExtendedDismaxParser.java
License:Apache License
private boolean containsClause(DisjunctionMaxQuery query, String field, String value, int boost, boolean fuzzy) { for (Query disjunct : query.getDisjuncts()) { if (containsClause(disjunct, field, value, boost, fuzzy)) { return true; }// w w w . j av a 2s . c om } return false; }
From source file:org.apache.solr.search.TestMaxScoreQueryParser.java
License:Apache License
@Test public void testBoost() { // Simple term query q = parse("foo^3.0"); assertEquals(3.0, q.getBoost(), 1e-15); // Some DMQ and one plain required q = parse("foo^5.0 bar^6.0 +baz^7"); clauses = clauses(q);//from w w w . j av a 2 s . c o m assertEquals(2, clauses.length); assertTrue(clauses[0].getQuery() instanceof DisjunctionMaxQuery); DisjunctionMaxQuery dmq = ((DisjunctionMaxQuery) clauses[0].getQuery()); float fooClause = ((BooleanQuery) dmq.getDisjuncts().get(0)).clauses().get(0).getQuery().getBoost(); assertEquals(5.0, fooClause, 1e-15); float barClause = ((BooleanQuery) dmq.getDisjuncts().get(1)).clauses().get(0).getQuery().getBoost(); assertEquals(6.0, barClause, 1e-15); assertEquals(7.0, clauses[1].getQuery().getBoost(), 1e-15); assertEquals(1.0, q.getBoost(), 1e-15); // Grouped with parens on top level q = parse("(foo^2.0 bar)^3.0"); clauses = clauses(q); assertEquals(1, clauses.length); assertTrue(clauses[0].getQuery() instanceof DisjunctionMaxQuery); dmq = ((DisjunctionMaxQuery) clauses[0].getQuery()); fooClause = ((BooleanQuery) dmq.getDisjuncts().get(0)).clauses().get(0).getQuery().getBoost(); assertEquals(2.0, fooClause, 1e-15); barClause = ((BooleanQuery) dmq.getDisjuncts().get(1)).clauses().get(0).getQuery().getBoost(); assertEquals(1.0, barClause, 1e-15); assertEquals(3.0, q.getBoost(), 1e-15); }
From source file:org.elasticsearch.action.debugquery.QueryToMapTransformer.java
License:Apache License
@Override public Map visit(DisjunctionMaxQuery query) throws Exception { final Map map = newQuery(query); map.put("tieBreaker", query.getTieBreakerMultiplier()); final ArrayList children = new ArrayList(query.getDisjuncts().size()); map.put("disjuncts", children); for (final Query childQuery : query.getDisjuncts()) { final Object childObj = QueryAcceptor.accept(childQuery, this); children.add(childObj);/* w ww . j ava 2 s . c om*/ } return map; }
From source file:org.elasticsearch.index.query.DisMaxQueryBuilderTests.java
License:Apache License
@Override protected void doAssertLuceneQuery(DisMaxQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { Collection<Query> queries = AbstractQueryBuilder.toQueries(queryBuilder.innerQueries(), context); assertThat(query, instanceOf(DisjunctionMaxQuery.class)); DisjunctionMaxQuery disjunctionMaxQuery = (DisjunctionMaxQuery) query; assertThat(disjunctionMaxQuery.getTieBreakerMultiplier(), equalTo(queryBuilder.tieBreaker())); assertThat(disjunctionMaxQuery.getDisjuncts().size(), equalTo(queries.size())); Iterator<Query> queryIterator = queries.iterator(); for (int i = 0; i < disjunctionMaxQuery.getDisjuncts().size(); i++) { assertThat(disjunctionMaxQuery.getDisjuncts().get(i), equalTo(queryIterator.next())); }/*from w w w . j a v a 2 s . c om*/ }
From source file:org.elasticsearch.index.query.DisMaxQueryBuilderTests.java
License:Apache License
public void testToQueryInnerPrefixQuery() throws Exception { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0); String queryAsString = "{\n" + " \"dis_max\":{\n" + " \"queries\":[\n" + " {\n" + " \"prefix\":{\n" + " \"" + STRING_FIELD_NAME + "\":{\n" + " \"value\":\"sh\",\n" + " \"boost\":1.2\n" + " }\n" + " }\n" + " }\n" + " ]\n" + " }\n" + "}"; Query query = parseQuery(queryAsString).toQuery(createShardContext()); assertThat(query, instanceOf(DisjunctionMaxQuery.class)); DisjunctionMaxQuery disjunctionMaxQuery = (DisjunctionMaxQuery) query; List<Query> disjuncts = disjunctionMaxQuery.getDisjuncts(); assertThat(disjuncts.size(), equalTo(1)); assertThat(disjuncts.get(0), instanceOf(BoostQuery.class)); BoostQuery boostQuery = (BoostQuery) disjuncts.get(0); assertThat((double) boostQuery.getBoost(), closeTo(1.2, 0.00001)); assertThat(boostQuery.getQuery(), instanceOf(PrefixQuery.class)); PrefixQuery firstQ = (PrefixQuery) boostQuery.getQuery(); // since age is automatically registered in data, we encode it as numeric assertThat(firstQ.getPrefix(), equalTo(new Term(STRING_FIELD_NAME, "sh"))); }
From source file:org.elasticsearch.index.query.MultiMatchQueryBuilderTests.java
License:Apache License
public void testToQueryMultipleFieldsDisMaxQuery() throws Exception { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0); Query query = multiMatchQuery("test").field(STRING_FIELD_NAME).field(STRING_FIELD_NAME_2).useDisMax(true) .toQuery(createShardContext()); assertThat(query, instanceOf(DisjunctionMaxQuery.class)); DisjunctionMaxQuery disMaxQuery = (DisjunctionMaxQuery) query; List<Query> disjuncts = disMaxQuery.getDisjuncts(); assertThat(disjuncts.get(0), instanceOf(TermQuery.class)); assertThat(((TermQuery) disjuncts.get(0)).getTerm(), equalTo(new Term(STRING_FIELD_NAME, "test"))); assertThat(disjuncts.get(1), instanceOf(TermQuery.class)); assertThat(((TermQuery) disjuncts.get(1)).getTerm(), equalTo(new Term(STRING_FIELD_NAME_2, "test"))); }
From source file:org.elasticsearch.index.query.QueryStringQueryBuilderTests.java
License:Apache License
public void testToQueryPhraseQuery() throws IOException { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0); Query query = queryStringQuery("\"term1 term2\"").defaultField(STRING_FIELD_NAME).phraseSlop(3) .toQuery(createShardContext()); assertThat(query, instanceOf(DisjunctionMaxQuery.class)); DisjunctionMaxQuery disjunctionMaxQuery = (DisjunctionMaxQuery) query; assertThat(disjunctionMaxQuery.getDisjuncts().size(), equalTo(1)); assertThat(disjunctionMaxQuery.getDisjuncts().get(0), instanceOf(PhraseQuery.class)); PhraseQuery phraseQuery = (PhraseQuery) disjunctionMaxQuery.getDisjuncts().get(0); assertThat(phraseQuery.getTerms().length, equalTo(2)); assertThat(phraseQuery.getTerms()[0], equalTo(new Term(STRING_FIELD_NAME, "term1"))); assertThat(phraseQuery.getTerms()[1], equalTo(new Term(STRING_FIELD_NAME, "term2"))); assertThat(phraseQuery.getSlop(), equalTo(3)); }
From source file:org.elasticsearch.index.query.QueryStringQueryBuilderTests.java
License:Apache License
public void testToQueryMultipleFieldsDisMaxQuery() throws Exception { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0); Query query = queryStringQuery("test").field(STRING_FIELD_NAME).field(STRING_FIELD_NAME_2).useDisMax(true) .toQuery(createShardContext()); assertThat(query, instanceOf(DisjunctionMaxQuery.class)); DisjunctionMaxQuery disMaxQuery = (DisjunctionMaxQuery) query; List<Query> disjuncts = disMaxQuery.getDisjuncts(); assertThat(((TermQuery) disjuncts.get(0)).getTerm(), equalTo(new Term(STRING_FIELD_NAME, "test"))); assertThat(((TermQuery) disjuncts.get(1)).getTerm(), equalTo(new Term(STRING_FIELD_NAME_2, "test"))); }
From source file:org.elasticsearch.index.query.QueryStringQueryBuilderTests.java
License:Apache License
public void testToQueryDisMaxQuery() throws Exception { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0); Query query = queryStringQuery("test").field(STRING_FIELD_NAME, 2.2f).field(STRING_FIELD_NAME_2) .useDisMax(true).toQuery(createShardContext()); assertThat(query, instanceOf(DisjunctionMaxQuery.class)); DisjunctionMaxQuery disMaxQuery = (DisjunctionMaxQuery) query; List<Query> disjuncts = disMaxQuery.getDisjuncts(); assertTermOrBoostQuery(disjuncts.get(0), STRING_FIELD_NAME, "test", 2.2f); assertTermOrBoostQuery(disjuncts.get(1), STRING_FIELD_NAME_2, "test", 1.0f); }