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

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

Introduction

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

Prototype

List clauses

To view the source code for org.apache.lucene.search BooleanQuery clauses.

Click Source Link

Usage

From source file:com.hrstc.lucene.queryreduction.PatentClassCodeBasedQueryReduction.java

License:Apache License

/**
 * Performs Rocchio's query expansion with pseudo feedback for each fields
 * separatlly qm = alpha * query + ( beta / relevanDocsCount ) * Sum ( rel
 * docs vector )/*w  w w.j  a  v  a 2s.  c  o m*/
 *
 * @param query
 *
 * @return expandedQuery
 *
 * @throws IOException
 * @throws ParseException
 */
@Override
public Query expandQuery(PatentQuery query) throws ParseException, IOException {
    BooleanQuery bQuery = new BooleanQuery();
    BooleanQuery bQueryFieldsExpanded = new BooleanQuery();
    BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE);
    //********************************************************************
    //**************** Get the sec of definition codes ******************* 
    //********************************************************************
    TotalHitCountCollector collector = new TotalHitCountCollector();
    Query codesQuery = GenerateClassCodesQuery.generateQuery(query.getFullClassCodes());
    //        System.err.println(codesQuery);
    classCodesSearcher.search(codesQuery, collector);
    IndexReader ir = classCodesSearcher.getIndexReader();
    TopDocs hits = classCodesSearcher.search(codesQuery, Math.max(1, collector.getTotalHits())); // Compute PRF set
    //                System.err.println("Found " + hits.totalHits
    //                        + " document(s)  that matched query '"
    //                        + codesQuery + "':");
    //                for (ScoreDoc scoreDoc : hits.scoreDocs) {
    //                    System.out.println("----------");
    //                    Document doc = classCodesSearcher.doc(scoreDoc.doc);
    //                    System.out.println(scoreDoc.score + "\t" + doc.get(PatentDocument.Classification) + "\t" + doc.get(PatentDocument.Title));// + "\t" + doc.get("type") + "\t" + doc.get("num") + "\t" + doc.get("lang"));
    ////            System.out.println(explanation.toString());
    //                }
    //                System.out.println("*************************************");
    Query expandedQuery = null;
    ClassCodeBasedQueryReduction queryExpansion = new ClassCodeBasedQueryReduction(hits, ir, Nbr_Terms);
    for (int i = 1; i < PatentQuery.getFields().length; i++) {
        if (query.getQueries()[i] != null && !query.getQueries()[i].equals("") && (i != 4 || i != 6)
                && query.getBoosts().get(PatentQuery.getFields()[i]) != 0) {
            QueryParser qp = new QueryParser(Version.LUCENE_48, PatentQuery.getFields()[i],
                    new StandardAnalyzer(Version.LUCENE_48));
            BooleanQuery bQueryFields = new BooleanQuery();// Contain a field to make the PRF field by field
            Query q = qp.parse(query.getQueries()[i]);
            if (query.isFilter()) {
                Query filter = new QueryParser(Version.LUCENE_48, PatentQuery.getFields()[0],
                        new StandardAnalyzer(Version.LUCENE_48)).parse(query.getQueries()[0]);
                bQueryFields.add(filter, BooleanClause.Occur.MUST);
            }
            if (!(q instanceof BooleanQuery) || ((BooleanQuery) q).getClauses().length > 0) {
                bQueryFields.add(q, BooleanClause.Occur.MUST);
            }

            //                System.err.println(hits.totalHits + " total matching documents for field " + query.getFields()[i] + ".");
            if (expandedQuery == null) {
                expandedQuery = queryExpansion.expandQuery(q, PatentQuery.getFields()[i]);
            } else {
                BooleanQuery bq = ((BooleanQuery) expandedQuery).clone();
                BooleanQuery bq2 = new BooleanQuery();
                for (BooleanClause bc : bq.clauses()) {
                    TermQuery tq = (TermQuery) bc.getQuery();
                    Term term = new Term(PatentQuery.getFields()[i], tq.getTerm().text());
                    TermQuery tq2 = new TermQuery(term);
                    tq2.setBoost(tq.getBoost());
                    bq2.add(tq2, BooleanClause.Occur.SHOULD);
                }
                expandedQuery = bq2;
            }
            bQueryFieldsExpanded.add(expandedQuery, BooleanClause.Occur.SHOULD);// Compute the new expanded query based on PRF set
            //                System.err.println("Expanded Query: " + expandedQuery);
            //                hits = searcher.search(expandedQuery, 100);
            //                System.err.println(hits.totalHits + " total matching documents"+ query.getFields()[i] + ".");
        }
    }
    if (query.isFilter()) {
        Query q = new QueryParser(Version.LUCENE_48, PatentQuery.getFields()[0],
                new StandardAnalyzer(Version.LUCENE_48)).parse(query.getQueries()[0]);
        q.setBoost(query.getBoosts().get(PatentQuery.getFields()[0]));
        bQuery.add(q, BooleanClause.Occur.MUST);
    }
    bQuery.add(bQueryFieldsExpanded, BooleanClause.Occur.MUST);
    //        hits = searcher.search(bQuery, 100);
    //                System.err.println(hits.totalHits + " total matching documents.");
    return bQuery;
}

From source file:com.hrstc.lucene.queryreduction.PatentRocchioQueryReduction.java

License:Apache License

/**
 * Performs Rocchio's query expansion with pseudo feedback for each fields
 * separatlly qm = alpha * query + ( beta / relevanDocsCount ) * Sum ( rel
 * docs vector )/*from   w w w. ja va  2s  .  c  o m*/
 *
 * @param query
 *
 * @return expandedQuery
 *
 * @throws IOException
 * @throws ParseException
 */
@Override
public Query expandQuery(PatentQuery query) throws ParseException, IOException {
    BooleanQuery bQuery = new BooleanQuery();
    BooleanQuery bQueryFieldsExpanded = new BooleanQuery();
    BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE);
    //*****************************************************************
    //**************** Compute the PRF for field (i)******************* 
    //*****************************************************************
    TotalHitCountCollector collector = new TotalHitCountCollector();
    searcher.search(query.parse(), collector);
    IndexReader ir = searcher.getIndexReader();
    TopDocs hits = searcher.search(query.parse(), Math.max(1, collector.getTotalHits())); // Compute PRF set
    //                System.err.println(hits.totalHits + " total matching documents for field " + query.getFields()[i] + ".");
    Query expandedQuery = null;
    RocchioQueryReduction queryExpansion = new RocchioQueryReduction(hits, ir, parameters, source, Nbr_Docs,
            Nbr_Terms);
    for (int i = 1; i < PatentQuery.getFields().length; i++) {
        if (query.getQueries()[i] != null && !query.getQueries()[i].equals("") && (i != 4 || i != 6)
                && query.getBoosts().get(PatentQuery.getFields()[i]) != 0) {
            QueryParser qp = new QueryParser(Version.LUCENE_48, PatentQuery.getFields()[i],
                    new StandardAnalyzer(Version.LUCENE_48));
            //                BooleanQuery bQueryFields = new BooleanQuery();// Contain a field to make the PRF field by field
            Query q = qp.parse(query.getQueries()[i]);
            //                if (query.isFilter()) {
            //                    Query filter = new QueryParser(Version.LUCENE_48, PatentQuery.getFields()[0],
            //                            new StandardAnalyzer(Version.LUCENE_48)).parse(query.getQueries()[0]);
            //                    bQueryFields.add(filter, BooleanClause.Occur.MUST);
            //                }
            //                if (!(q instanceof BooleanQuery) || ((BooleanQuery) q).getClauses().length > 0) {
            //                    bQueryFields.add(q, BooleanClause.Occur.MUST);
            //                }                
            if (expandedQuery == null) {
                expandedQuery = queryExpansion.reduceQuery(q, PatentQuery.getFields()[i]);
            } else {
                BooleanQuery bq = ((BooleanQuery) expandedQuery).clone();
                BooleanQuery bq2 = new BooleanQuery();
                for (BooleanClause bc : bq.clauses()) {
                    TermQuery tq = (TermQuery) bc.getQuery();
                    Term term = new Term(PatentQuery.getFields()[i], tq.getTerm().text());
                    TermQuery tq2 = new TermQuery(term);
                    tq2.setBoost(tq.getBoost());
                    bq2.add(tq2, BooleanClause.Occur.SHOULD);
                }
                expandedQuery = bq2;
            }
            bQueryFieldsExpanded.add(expandedQuery, BooleanClause.Occur.SHOULD);// Compute the new expanded query based on PRF set
            //                System.err.println("Expanded Query: " + expandedQuery);
            //                hits = searcher.search(expandedQuery, 100);
            //                System.err.println(hits.totalHits + " total matching documents"+ query.getFields()[i] + ".");
        }
    }
    if (query.isFilter()) {
        Query q = new QueryParser(Version.LUCENE_48, PatentQuery.getFields()[0],
                new StandardAnalyzer(Version.LUCENE_48)).parse(query.getQueries()[0]);
        q.setBoost(query.getBoosts().get(PatentQuery.getFields()[0]));
        bQuery.add(q, BooleanClause.Occur.MUST);
    }
    bQuery.add(bQueryFieldsExpanded, BooleanClause.Occur.MUST);
    //        TopDocs hits = searcher.search(bQuery, 100);
    //                System.err.println(hits.totalHits + " total matching documents.");
    return bQuery;
}

From source file:com.jaeksoft.searchlib.index.osse.query.OsseBooleanQuery.java

License:Open Source License

OsseBooleanQuery(BooleanQuery booleanQuery) throws SearchLibException {
    clauses = new ArrayList<OsseBooleanClause>(booleanQuery.clauses().size());
    for (BooleanClause booleanClause : booleanQuery)
        clauses.add(new OsseBooleanClause(booleanClause));
}

From source file:com.liferay.portal.search.solr.internal.query.TermQueryTranslatorImpl.java

License:Open Source License

private org.apache.lucene.search.Query _toCaseInsensitiveSubstringQuery(
        org.apache.lucene.search.BooleanQuery booleanQuery) {

    org.apache.lucene.search.BooleanQuery newBooleanQuery = new org.apache.lucene.search.BooleanQuery();

    List<BooleanClause> clauses = booleanQuery.clauses();

    for (BooleanClause booleanClause : clauses) {
        org.apache.lucene.search.TermQuery termQuery = (org.apache.lucene.search.TermQuery) booleanClause
                .getQuery();/* www .  j  a  v a  2s .  com*/

        org.apache.lucene.search.Query query = _toCaseInsensitiveSubstringQuery(termQuery);

        newBooleanQuery.add(query, booleanClause.getOccur());
    }

    return newBooleanQuery;
}

From source file:com.nearinfinity.blur.lucene.search.SuperParser.java

License:Apache License

private Query reprocess(Query query) {
    if (query == null || !isSuperSearch()) {
        return wrapFilter(query);
    }/*from ww w .  ja  v a  2  s.  c  o  m*/
    if (query instanceof BooleanQuery) {
        BooleanQuery booleanQuery = (BooleanQuery) query;
        if (isSameGroupName(booleanQuery)) {
            return newSuperQuery(query);
        } else {
            List<BooleanClause> clauses = booleanQuery.clauses();
            for (BooleanClause clause : clauses) {
                clause.setQuery(reprocess(clause.getQuery()));
            }
            return booleanQuery;
        }
    } else {
        return newSuperQuery(query);
    }
}

From source file:com.nearinfinity.blur.lucene.search.SuperParser.java

License:Apache License

private boolean isSameGroupName(Query query, String groupName) {
    if (query instanceof BooleanQuery) {
        BooleanQuery booleanQuery = (BooleanQuery) query;
        for (BooleanClause clause : booleanQuery.clauses()) {
            if (!isSameGroupName(clause.getQuery(), groupName)) {
                return false;
            }//from  ww  w.ja v  a2 s . c  o m
        }
        return true;
    } else {
        String fieldName = fieldNames.get(query);
        String currentGroupName = getGroupName(fieldName);
        if (groupName.equals(currentGroupName)) {
            return true;
        }
        return false;
    }
}

From source file:com.nearinfinity.blur.lucene.search.SuperParser.java

License:Apache License

private String findFirstGroupName(Query query) {
    if (query instanceof BooleanQuery) {
        BooleanQuery booleanQuery = (BooleanQuery) query;
        for (BooleanClause clause : booleanQuery.clauses()) {
            return findFirstGroupName(clause.getQuery());
        }/*  w  ww. ja va 2 s. com*/
        return null;
    } else {
        String fieldName = fieldNames.get(query);
        return getGroupName(fieldName);
    }
}

From source file:com.recomdata.search.Finder.java

License:Open Source License

private Filter buildFilter(LinkedHashMap<String, ArrayList<String>> filterTerms) {

    BooleanQuery andQuery = new BooleanQuery();
    if (filterTerms.containsKey("REPOSITORY")) {
        ArrayList<String> list = filterTerms.get("REPOSITORY");
        ArrayList<Query> queries = new ArrayList<Query>();
        for (String value : list) {
            Term term = new Term("repository", value);
            TermQuery termQuery = new TermQuery(term);
            queries.add(termQuery);//from www.  j a va  2  s  .  c  o  m
        }
        addQueries(andQuery, queries);
    }

    if (filterTerms.containsKey("PATH")) {
        try {
            ArrayList<String> list = filterTerms.get("PATH");
            if (list.size() > 0) {
                StringReader reader = new StringReader(list.get(0));
                StandardAnalyzer analyzer = new StandardAnalyzer();
                TokenStream tokenizer = analyzer.tokenStream("path", reader);
                PhraseQuery phraseQuery = new PhraseQuery();
                Token token = new Token();
                for (token = tokenizer.next(token); token != null; token = tokenizer.next(token)) {
                    Term term = new Term("path", token.term());
                    phraseQuery.add(term);
                }
                andQuery.add(phraseQuery, BooleanClause.Occur.MUST);
            }
        } catch (IOException ex) {
            // do nothing
        }
    }

    if (filterTerms.containsKey("EXTENSION")) {
        ArrayList<String> list = filterTerms.get("EXTENSION");
        ArrayList<Query> queries = new ArrayList<Query>();
        for (String value : list) {
            Term term = new Term("extension", value.toLowerCase());
            TermQuery termQuery = new TermQuery(term);
            queries.add(termQuery);
        }
        addQueries(andQuery, queries);
    }

    if (filterTerms.containsKey("NOTEXTENSION")) {
        ArrayList<String> list = filterTerms.get("NOTEXTENSION");
        for (String value : list) {
            Term term = new Term("extension", value.toLowerCase());
            TermQuery termQuery = new TermQuery(term);
            andQuery.add(termQuery, BooleanClause.Occur.MUST_NOT);
        }
    }

    if (andQuery.clauses().size() > 0) {
        return new QueryWrapperFilter(andQuery);
    }
    return null;

}

From source file:com.stratio.cassandra.lucene.IndexServiceWide.java

License:Apache License

/** {@inheritDoc} */
@Override//from  w  w w  .  ja v a2s . c om
public Optional<Query> query(DataRange dataRange) {

    // Extract data range data
    PartitionPosition startPosition = dataRange.startKey();
    PartitionPosition stopPosition = dataRange.stopKey();
    Token startToken = startPosition.getToken();
    Token stopToken = stopPosition.getToken();
    Optional<ClusteringPrefix> maybeStartClustering = KeyMapper.startClusteringPrefix(dataRange);
    Optional<ClusteringPrefix> maybeStopClustering = KeyMapper.stopClusteringPrefix(dataRange);

    // Prepare query builder
    BooleanQuery.Builder builder = new BooleanQuery.Builder();

    // Add first partition filter
    maybeStartClustering.ifPresent(startClustering -> {
        DecoratedKey startKey = (DecoratedKey) startPosition;
        builder.add(keyMapper.query(startKey, startClustering, null, false, true), SHOULD);
    });

    // Add token range filter
    boolean includeStart = startPosition.kind() == MIN_BOUND && !maybeStartClustering.isPresent();
    boolean includeStop = stopPosition.kind() == MAX_BOUND && !maybeStopClustering.isPresent();
    tokenMapper.query(startToken, stopToken, includeStart, includeStop).ifPresent(x -> builder.add(x, SHOULD));

    // Add last partition filter
    maybeStopClustering.ifPresent(stopClustering -> {
        DecoratedKey stopKey = (DecoratedKey) stopPosition;
        builder.add(keyMapper.query(stopKey, null, stopClustering, true, false), SHOULD);
    });

    // Return query, or empty if there are no restrictions
    BooleanQuery query = builder.build();
    return query.clauses().isEmpty() ? Optional.empty() : Optional.of(query);
}

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(// w  w  w.  j  av  a 2  s . c o  m
            "(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());
}