Example usage for org.apache.lucene.search BooleanClause isRequired

List of usage examples for org.apache.lucene.search BooleanClause isRequired

Introduction

In this page you can find the example usage for org.apache.lucene.search BooleanClause isRequired.

Prototype

public boolean isRequired() 

Source Link

Usage

From source file:cn.b2b.index.product.index.ProductQueryOptimizer.java

private BooleanQuery filterQuery(Searcher searcher, BooleanQuery original, BooleanQuery query)
        throws IOException {
    BooleanQuery filterQuery = null;/*from   w w w.j  a v  a  2s  .c  om*/
    BooleanClause[] clauses = original.getClauses();
    for (int i = 0; i < clauses.length; i++) {
        BooleanClause c = clauses[i];
        if (c.isRequired() // required
                && c.getQuery().getBoost() == 0.0f // boost is zero
                && c.getQuery() instanceof TermQuery // TermQuery
                && (searcher.docFreq(((TermQuery) c.getQuery()).getTerm())
                        / (float) searcher.maxDoc()) >= threshold) { // check threshold
            if (filterQuery == null)
                filterQuery = new BooleanQuery();
            // lucene1.4.3 -> lucene2.0.0
            // filterQuery.add(c.getQuery(), true, false); // filter it
            filterQuery.add(c.getQuery(), BooleanClause.Occur.MUST); // filter
            // it
        } else {
            query.add(c); // query it
        }
    }
    return filterQuery;
}

From source file:cn.b2b.index.product.index.ProductQueryOptimizer.java

@Override
public Writable explain(IndexSearcher searcher, Writable param) throws Exception {

    ExplainParam queryParam = (ExplainParam) param;
    Query oriquery = queryParam.getQuery();
    BooleanQuery original = QueryFilters.filter(oriquery, Constants.SLOP_SCORE_CVM_CLASS);
    BooleanQuery query = new BooleanQuery();
    BooleanQuery filterQuery = null;/*from   w  w  w.  ja v  a 2 s. co m*/
    BooleanClause[] clauses = original.getClauses();
    for (int i = 0; i < clauses.length; i++) {
        BooleanClause c = clauses[i];
        if (c.isRequired() // required
                && c.getQuery().getBoost() == 0.0f // boost is zero
                && c.getQuery() instanceof TermQuery // TermQuery
                && (searcher.docFreq(((TermQuery) c.getQuery()).getTerm())
                        / (float) searcher.maxDoc()) >= threshold) { // check threshold
            if (filterQuery == null)
                filterQuery = new BooleanQuery();
            // lucene1.4.3 -> lucene2.0.0
            // filterQuery.add(c.getQuery(), true, false); // filter it
            filterQuery.add(c.getQuery(), BooleanClause.Occur.MUST); // filter
            // it
        } else {
            query.add(c); // query it
        }
    }

    Filter filter = null;
    if (filterQuery != null) {
        synchronized (cache) { // check cache
            filter = (Filter) cache.get(filterQuery);
        }
        if (filter == null) { // miss
            filter = new QueryFilter(filterQuery); // construct new entry
            synchronized (cache) {
                cache.put(filterQuery, filter); // cache it
            }
        }
    }
    ScoreParam scoreParam = new ScoreParam();
    // store segment query word
    query.setQueryStr(original.getQueryStr());

    float[] ranks = (float[]) MemoryFieldCache.get("rank");
    Explanation explain = searcher.explain(query, queryParam.getDoc());
    return new UTF8("RANK:" + ranks[queryParam.getDoc()] + "\t" + explain.toString());
}

From source file:com.browseengine.bobo.search.section.SectionSearchQueryPlanBuilder.java

License:Apache License

private SectionSearchQueryPlan translateBooleanQuery(BooleanQuery query) throws IOException {
    ArrayList<Query> requiredClauses = new ArrayList<Query>();
    ArrayList<Query> prohibitedClauses = new ArrayList<Query>();
    ArrayList<Query> optionalClauses = new ArrayList<Query>();
    BooleanClause[] clauses = query.getClauses();
    for (BooleanClause clause : clauses) {
        if (clause.isRequired()) {
            requiredClauses.add(clause.getQuery());
        } else if (clause.isProhibited()) {
            prohibitedClauses.add(clause.getQuery());
        } else {//from w  ww .j a v  a  2 s .  com
            optionalClauses.add(clause.getQuery());
        }
    }

    SectionSearchQueryPlan positiveNode = null;
    SectionSearchQueryPlan negativeNode = null;

    if (requiredClauses.size() > 0) {
        if (requiredClauses.size() == 1) {
            positiveNode = translate(requiredClauses.get(0));
        } else {
            SectionSearchQueryPlan[] subqueries = translate(requiredClauses);
            if (subqueries != null && subqueries.length > 0)
                positiveNode = new AndNode(subqueries);
        }
    } else if (optionalClauses.size() > 0) {
        if (optionalClauses.size() == 1) {
            positiveNode = translate(optionalClauses.get(0));
        } else {
            SectionSearchQueryPlan[] subqueries = translate(optionalClauses);
            if (subqueries != null && subqueries.length > 0)
                positiveNode = new OrNode(subqueries);
        }
    }

    if (prohibitedClauses.size() > 0) {
        if (prohibitedClauses.size() == 1) {
            negativeNode = translate(prohibitedClauses.get(0));
        } else {
            negativeNode = new OrNode(translate(prohibitedClauses));
        }
    }

    if (negativeNode == null) {
        return positiveNode;
    } else {
        if (positiveNode == null) {
            return new UnaryNotNode(negativeNode);
        } else {
            return new AndNotNode(positiveNode, negativeNode);
        }
    }
}

From source file:com.zimbra.cs.index.LuceneQueryOperation.java

License:Open Source License

private Query expandLazyMultiPhraseQuery(Query query) throws IOException {
    if (query instanceof LazyMultiPhraseQuery) {
        LazyMultiPhraseQuery lazy = (LazyMultiPhraseQuery) query;
        int max = LC.zimbra_index_wildcard_max_terms_expanded.intValue();
        MultiPhraseQuery mquery = new MultiPhraseQuery();
        for (Term[] terms : lazy.getTermArrays()) {
            if (terms.length != 1) {
                mquery.add(terms);/*  www  .  j  a v a 2s .co  m*/
                continue;
            }
            Term base = terms[0];
            if (!lazy.expand.contains(base)) {
                mquery.add(terms);
                continue;
            }
            List<Term> expanded = Lists.newArrayList();
            TermFieldEnumeration itr = searcher.getIndexReader().getTermsForField(base.field(), base.text());
            try {
                while (itr.hasMoreElements()) {
                    BrowseTerm term = itr.nextElement();
                    if (term != null && term.getText().startsWith(base.text())) {
                        if (expanded.size() >= max) { // too many terms expanded
                            break;
                        }
                        expanded.add(new Term(base.field(), term.getText()));
                    } else {
                        break;
                    }
                }
            } finally {
                Closeables.closeQuietly(itr);
            }
            if (expanded.isEmpty()) {
                return null;
            } else {
                mquery.add(expanded.toArray(new Term[expanded.size()]));
            }
        }
        return mquery;
    } else if (query instanceof BooleanQuery) {
        ListIterator<BooleanClause> itr = ((BooleanQuery) query).clauses().listIterator();
        while (itr.hasNext()) {
            BooleanClause clause = itr.next();
            Query result = expandLazyMultiPhraseQuery(clause.getQuery());
            if (result == null) {
                if (clause.isRequired()) {
                    return null;
                } else {
                    itr.remove();
                }
            } else if (result != clause.getQuery()) {
                clause.setQuery(result);
            }
        }
        return ((BooleanQuery) query).clauses().isEmpty() ? null : query;
    } else {
        return query;
    }
}

From source file:de.hybris.platform.solr.search.MultiMaxScoreQParser.java

License:Open Source License

@Override
public Query parse() throws SyntaxError {
    final Query q = super.parse();

    if (!(q instanceof BooleanQuery)) {
        return q;
    }//from  ww  w. j a  va  2 s  .  com

    final BooleanQuery oldQuery = (BooleanQuery) q;
    final BooleanQuery.Builder newQuery = new BooleanQuery.Builder();

    List<Query> disjuncts = null;

    for (final BooleanClause clause : oldQuery.clauses()) {
        if (clause.isProhibited() || clause.isRequired()) {
            newQuery.add(clause);
        } else {
            final Query subQuery = clause.getQuery();
            if (!(subQuery instanceof BooleanQuery)) {
                if (disjuncts == null) {
                    disjuncts = new ArrayList<>();
                }

                disjuncts.add(clause.getQuery());
            } else {
                final List<Query> subQueriesList = new ArrayList<>();
                for (final BooleanClause subQueryClause : ((BooleanQuery) subQuery).clauses()) {
                    subQueriesList.add(subQueryClause.getQuery());
                }
                final DisjunctionMaxQuery subDmq = new DisjunctionMaxQuery(subQueriesList, tie);
                newQuery.add(subDmq, BooleanClause.Occur.SHOULD);
            }
        }
    }

    if (CollectionUtils.isNotEmpty(disjuncts)) {
        final DisjunctionMaxQuery disjunctionQuery = new DisjunctionMaxQuery(disjuncts, tie);
        newQuery.add(disjunctionQuery, BooleanClause.Occur.SHOULD);
    }

    return newQuery.build();
}

From source file:de.joergjahnke.jdesktopsearch.abstractionlayer.SQLServerIndexManager.java

License:Open Source License

/**
 * Get SQL queries' WHERE-clause/* w ww .  j  a  v  a 2  s  .  co m*/
 *
 * @param   query   Lucene query to translate into a SQL WHERE-clause
 * @param   logicalOperator logical operator to use when connecting the results of the query to an existing WHERE-clause
 * @param   termQuery   SQL query fragment to use
 * @return  list of strings where the first entry is an SQL query that can be used in a PreparedStatement. The following
 *          strings are to be set as parameters for this PreparedStatement.
 */
private WhereClauseParameters getSQLWhereClause(final Query query, String logicalOperator,
        final String termQuery) {
    if (DEBUG)
        System.err.println(this.getClass().getName() + ": Query-Class: " + query.getClass());
    if (DEBUG)
        System.err.println(this.getClass().getName() + ": Query: " + query);

    final List<String> params = new LinkedList<String>();
    final StringBuffer sql = new StringBuffer();

    // process BooleanQuerys
    // these contain of two subqueries which have to be connected by a logical operator
    if (query instanceof BooleanQuery) {
        boolean brackedOpened = false;
        final List<String> sqlList = new LinkedList<String>();
        final List<Collection<String>> paramsList = new LinkedList<Collection<String>>();

        for (BooleanClause clause : ((BooleanQuery) query).getClauses()) {
            if (DEBUG)
                System.err.println(this.getClass().getName() + ": BooleanClause: p: " + clause.isProhibited()
                        + ", r:  " + clause.isRequired());

            if (clause.isProhibited()) {
                if (!"AND NOT".equals(logicalOperator)) {
                    sql.append(" " + logicalOperator + " NOT ( 1=1");
                    brackedOpened = true;
                    appendToWhereClause(sqlList, paramsList, sql, params);
                }

                final WhereClauseParameters subQuery = getSQLWhereClause(clause.getQuery(), "AND", termQuery);

                sqlList.add(subQuery.getSQL());
                paramsList.add(subQuery.getParameters());

                logicalOperator = "AND NOT";
            } else if (clause.isRequired()) {
                if (!"AND".equals(logicalOperator)) {
                    sql.append(" " + logicalOperator + " ( 1=1");
                    brackedOpened = true;
                    appendToWhereClause(sqlList, paramsList, sql, params);
                }

                final WhereClauseParameters subQuery = getSQLWhereClause(clause.getQuery(), "AND", termQuery);

                sqlList.add(subQuery.getSQL());
                paramsList.add(subQuery.getParameters());

                logicalOperator = "AND";
            } else {
                if (!"OR".equals(logicalOperator)) {
                    sql.append(" " + logicalOperator + " ( 1=2");
                    brackedOpened = true;
                    appendToWhereClause(sqlList, paramsList, sql, params);
                }

                final WhereClauseParameters subQuery = getSQLWhereClause(clause.getQuery(), "OR", termQuery);

                sqlList.add(subQuery.getSQL());
                paramsList.add(subQuery.getParameters());

                logicalOperator = "OR";
            }
        }

        // not all parts of the query has already been added
        if (!sqlList.isEmpty()) {
            if ("OR".equals(logicalOperator)) {
                optimizeQuery(sqlList, paramsList);
            }

            if (DEBUG)
                System.err.println(this.getClass().getName() + ": AfterOptimization: New SQL= " + sql);
            if (DEBUG)
                System.err
                        .println(this.getClass().getName() + ": AfterOptimization: New Parameters= " + params);

            // then add the rest
            appendToWhereClause(sqlList, paramsList, sql, params);

            if (DEBUG)
                System.err.println(this.getClass().getName() + ": AfterOptimization: New SQL= " + sql);
            if (DEBUG)
                System.err
                        .println(this.getClass().getName() + ": AfterOptimization: New Parameters= " + params);
        }

        // a bracket has been opened
        if (brackedOpened) {
            // then only close the bracket
            sql.append(" )");
        }
        // process TermQuery, WildCardQuery or PrefixQuery
        // these contain a single term which needs to be matched and may contain one or more wildcards
    } else if (query instanceof TermQuery || query instanceof WildcardQuery || query instanceof PrefixQuery) {
        processTermQuery(sql, params, query, logicalOperator, termQuery);
        // process PhraseQuery
        // such a query contains a set phrase
    } else if (query instanceof PhraseQuery) {
        processPhraseQuery(sql, params, query, logicalOperator, termQuery);
        // process RangeQuery
        // such a query contains an upper and lower boundary wherein the results may lie
    } else if (query instanceof RangeQuery) {
        processRangeQuery(sql, params, query, logicalOperator, termQuery);
    } else {
        throw new RuntimeException("Query type '" + query.getClass() + "' not supported!");
    }

    if (DEBUG)
        System.err.println(this.getClass().getName() + ": SQL= " + sql);
    if (DEBUG)
        System.err.println(this.getClass().getName() + ": Params= " + params);

    return new WhereClauseParameters(sql.toString(), params);
}

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

License:Open Source License

@Override
public BooleanQuery visit(BooleanQuery boolQuery) {
    PhraseQuery phraseQuery = new PhraseQuery();

    for (BooleanClause clause : boolQuery.getClauses()) {
        if (clause.isProhibited() || !clause.isRequired() || !(clause.getQuery() instanceof TermQuery))
            return super.visit(boolQuery); // only consider required terms

        TermQuery tq = (TermQuery) clause.getQuery();

        Field field = Field.getByName(tq.getTerm().field());
        if (field != Field.CONTENTS)
            continue;

        phraseQuery.add(tq.getTerm());/*from w  ww  . ja v a2 s . co  m*/
    }

    phraseQuery.setSlop(DEFAULT_SLOP);

    BooleanQuery bq = new BooleanQuery();
    bq.add(phraseQuery, Occur.SHOULD);
    bq.add(boolQuery, Occur.SHOULD);
    bq.setBoost(boolQuery.getBoost());

    phraseQuery.setBoost(boolQuery.getBoost());
    boolQuery.setBoost(phraseQuery.getBoost() * 0.5f);

    return bq;
}

From source file:org.apache.jackrabbit.core.query.lucene.LuceneQueryBuilder.java

License:Apache License

public Object visit(OrQueryNode node, Object data) throws RepositoryException {
    BooleanQuery orQuery = new BooleanQuery();
    Object[] result = node.acceptOperands(this, null);
    for (Object aResult : result) {
        Query operand = (Query) aResult;
        if (operand instanceof BooleanQuery) {
            // check if the clauses are all optional, then
            // we can collapse into the the enclosing orQuery
            boolean hasNonOptional = false;
            for (BooleanClause clause : ((BooleanQuery) operand).getClauses()) {
                if (clause.isProhibited() || clause.isRequired()) {
                    hasNonOptional = true;
                    break;
                }//from   ww w .  ja  va 2s  . c om
            }
            if (hasNonOptional) {
                // cannot collapse
                orQuery.add(operand, Occur.SHOULD);
            } else {
                // collapse
                for (BooleanClause clause : ((BooleanQuery) operand).getClauses()) {
                    orQuery.add(clause);
                }
            }
        } else {
            orQuery.add(operand, Occur.SHOULD);
        }
    }
    return orQuery;
}

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

License:Apache License

public TopDocs optimize(BooleanQuery original, Searcher searcher, int numHits, String sortField,
        boolean reverse) throws IOException {
    BooleanQuery query = new BooleanQuery();
    Filter filter = null;/*from  w w w.j  a v a2s. c  o m*/

    BooleanClause[] clauses = original.getClauses();
    for (int i = 0; i < clauses.length; i++) {
        BooleanClause c = clauses[i];
        if (c.isRequired() && c.getQuery().getBoost() == 0.0f) { // boost is zero

            if (c.getQuery() instanceof TermQuery // TermQuery
                    && (searcher.docFreq(((TermQuery) c.getQuery()).getTerm())
                            / (float) searcher.maxDoc()) < threshold) { // beneath threshold
                query.add(c);
            } else if (c.getQuery() instanceof RangeQuery) { // RangeQuery        
                query.add(c);
            }
        } else {
            query.add(c); // query it
        }
    }

    query.setFunctions(original.getFunctions());
    if (sortField != null) { // to sort result by sortField
        query.add(new PwaSortQuery(sortField, reverse), BooleanClause.Occur.MUST);
    }

    // print query
    LOG.info("Query:" + query.toString());

    // no hit limit
    if (this.maxFulltextMatchesRanked <= 0 && timerThread == null) {
        return searcher.search(query, filter, numHits);
    }

    // hits limited in time or in count -- use a LimitedCollector
    LimitedCollector collector = new LimitedCollector(numHits, maxFulltextMatchesRanked, maxTickCount,
            timerThread, (sortField != null) ? !reverse : reverse);
    LimitExceeded exceeded = null;
    TimeExceeded timeExceeded = null;
    try {
        searcher.search(query, filter, collector);
    } catch (LimitExceeded le) {
        exceeded = le;
    } catch (TimeExceeded te) {
        timeExceeded = te;
    }
    TopDocs results = collector.topDocs();
    if (exceeded != null) { // limit was exceeded
        results.totalHits = (int) (results.totalHits * (searcher.maxDoc() / (float) exceeded.maxDoc)); // estimate totalHits
    } else if (timeExceeded != null) {
        results.totalHits = (int) (results.totalHits * (searcher.maxDoc() / (float) timeExceeded.maxDoc));
    }
    return results;
}

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("(");
    }/*from   ww w . j  ava  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();
}