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.zimbra.cs.index.LuceneQueryOperation.java

License:Open Source License

/**
 * It is not possible to search for queries that only consist of a MUST_NOT clause. Combining with MatchAllDocsQuery
 * works in general, but we generate more than one documents per item for multipart messages. If we match including
 * non top level parts, negative queries will end up matching everything. Therefore we only match the top level part
 * for negative queries./*  ww w.j a v  a  2  s.co  m*/
 */
private void fixMustNotOnly(BooleanQuery query) {
    for (BooleanClause clause : query.clauses()) {
        if (clause.getQuery() instanceof BooleanQuery) {
            fixMustNotOnly((BooleanQuery) clause.getQuery());
        }
        if (clause.getOccur() != BooleanClause.Occur.MUST_NOT) {
            return;
        }
    }

    query.add(new TermQuery(new Term(LuceneFields.L_PARTNAME, LuceneFields.L_PARTNAME_TOP)),
            BooleanClause.Occur.SHOULD);
    Set<MailItem.Type> types = context.getParams().getTypes();
    if (types.contains(MailItem.Type.CONTACT)) {
        query.add(new TermQuery(new Term(LuceneFields.L_PARTNAME, LuceneFields.L_PARTNAME_CONTACT)),
                BooleanClause.Occur.SHOULD);
    }
    if (types.contains(MailItem.Type.NOTE)) {
        query.add(new TermQuery(new Term(LuceneFields.L_PARTNAME, LuceneFields.L_PARTNAME_NOTE)),
                BooleanClause.Occur.SHOULD);
    }
}

From source file:dcu.com.ie.patent.queryreduction.PatentMagdyQueryReduction.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 . 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 {
    IndexReader ir = searcher.getIndexReader();
    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);
    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;
    MagdyQueryReduction qe = new MagdyQueryReduction(hits, ir, PatentQuery.getFields()[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 = qe.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:dcu.com.ie.synset.PatentSynSetQueryExpansion.java

@Override
public Query expandQuery(PatentQuery query) throws ParseException, IOException {
    BooleanQuery bQuery = new BooleanQuery();
    BooleanQuery bQueryFieldsExpanded = new BooleanQuery();
    BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE);
    Query expandedQuery = null;//from   w ww  . j  a va  2  s .  c om
    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));
            Query q = qp.parse(query.getQueries()[i]);
            if (expandedQuery == null) {
                BooleanQuery bq;
                if (q instanceof BooleanQuery) {
                    bq = ((BooleanQuery) q).clone();
                } else {
                    bq = new BooleanQuery();
                    bq.add(q, BooleanClause.Occur.SHOULD);
                }

                BooleanQuery bq2 = new BooleanQuery();
                for (BooleanClause bc : bq.clauses()) {
                    TermQuery tq = (TermQuery) bc.getQuery();
                    bq2.add(tq, BooleanClause.Occur.SHOULD);
                    //                        System.err.println(tq.getTerm().text());
                    List<Map.Entry<String, Double>> l = synset.getSynSeyList(tq.getTerm().text(), Nbr_Terms);
                    for (Map.Entry<String, Double> e : l) {
                        //                            System.err.println("\t" + e.getKey() + " -> " + e.getValue());
                        Term term = new Term(PatentQuery.getFields()[i], e.getKey());
                        TermQuery tq2 = new TermQuery(term);
                        float boost = tq.getBoost();
                        if (weigth) {
                            boost *= e.getValue().floatValue();
                        }
                        tq2.setBoost(boost);
                        bq2.add(tq2, BooleanClause.Occur.SHOULD);
                    }
                }
                expandedQuery = bq2;
            } 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);

        }
    }
    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: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.unihildesheim.iw.lucene.query.RelaxableCommonTermsQuery.java

License:Open Source License

/**
 * New instance using settings from the supplied {@link Builder} instance.
 *
 * @param builder {@link Builder} Instance builder
 * @throws IOException Thrown on low-level i/o-errors
 *//*from   w w  w . j  av  a  2  s .com*/
@SuppressWarnings({ "ObjectAllocationInLoop", "ObjectEquality" })
RelaxableCommonTermsQuery(@NotNull final Builder builder) throws IOException {
    // get all query terms
    assert builder.queryStr != null;
    assert builder.analyzer != null;
    this.queryTerms = QueryUtils.tokenizeQueryString(builder.queryStr, builder.analyzer);

    // list of unique terms contained in the query (stopped, analyzed)
    final String[] uniqueQueryTerms = this.queryTerms.stream().distinct().toArray(String[]::new);
    final int uniqueTermsCount = uniqueQueryTerms.length;

    // heavily based on code from org.apache.lucene.queries.CommonTermsQuery
    assert builder.reader != null;
    final List<LeafReaderContext> leaves = builder.reader.leaves();
    final int maxDoc = builder.reader.maxDoc();
    TermsEnum termsEnum = null;
    final List<Query> subQueries = new ArrayList<>(10);

    assert builder.fields != null;
    for (final String field : builder.fields) {
        final TermContext[] tcArray = new TermContext[uniqueTermsCount];
        final BooleanQuery lowFreq = new BooleanQuery();
        final BooleanQuery highFreq = new BooleanQuery();

        // collect term statistics
        for (int i = 0; i < uniqueTermsCount; i++) {
            final Term term = new Term(field, uniqueQueryTerms[i]);
            for (final LeafReaderContext context : leaves) {
                final TermContext termContext = tcArray[i];
                final Fields fields = context.reader().fields();
                final Terms terms = fields.terms(field);
                if (terms != null) {
                    // only, if field exists
                    termsEnum = terms.iterator(termsEnum);
                    if (termsEnum != TermsEnum.EMPTY) {
                        if (termsEnum.seekExact(term.bytes())) {
                            if (termContext == null) {
                                tcArray[i] = new TermContext(builder.reader.getContext(), termsEnum.termState(),
                                        context.ord, termsEnum.docFreq(), termsEnum.totalTermFreq());
                            } else {
                                termContext.register(termsEnum.termState(), context.ord, termsEnum.docFreq(),
                                        termsEnum.totalTermFreq());
                            }
                        }
                    }
                }
            }

            // build query
            if (tcArray[i] == null) {
                lowFreq.add(new TermQuery(term), builder.lowFreqOccur);
            } else {
                if ((builder.maxTermFrequency >= 1f && (float) tcArray[i].docFreq() > builder.maxTermFrequency)
                        || (tcArray[i].docFreq() > (int) Math
                                .ceil((double) (builder.maxTermFrequency * (float) maxDoc)))) {
                    highFreq.add(new TermQuery(term, tcArray[i]), builder.highFreqOccur);
                } else {
                    lowFreq.add(new TermQuery(term, tcArray[i]), builder.lowFreqOccur);
                }
            }

            final int numLowFreqClauses = lowFreq.clauses().size();
            final int numHighFreqClauses = highFreq.clauses().size();
            if (builder.lowFreqOccur == Occur.SHOULD && numLowFreqClauses > 0) {
                lowFreq.setMinimumNumberShouldMatch(numLowFreqClauses);
            }
            if (builder.highFreqOccur == Occur.SHOULD && numHighFreqClauses > 0) {
                highFreq.setMinimumNumberShouldMatch(numHighFreqClauses);
            }
        }

        if (LOG.isDebugEnabled()) {
            LOG.debug("qLF={}", lowFreq);
            LOG.debug("qHF={}", highFreq);
        }

        if (lowFreq.clauses().isEmpty()) {
            subQueries.add(highFreq);
        } else if (highFreq.clauses().isEmpty()) {
            subQueries.add(lowFreq);
        } else {
            final BooleanQuery query = new BooleanQuery(true); // final query
            query.add(highFreq, Occur.SHOULD);
            query.add(lowFreq, Occur.MUST);
            subQueries.add(query);
        }
    }
    if (LOG.isDebugEnabled()) {
        LOG.debug("qList={}", subQueries);
    }

    this.query = subQueries.size() == 1 ? subQueries.get(0) : new DisjunctionMaxQuery(subQueries, 0.1f);

    if (LOG.isDebugEnabled()) {
        LOG.debug("RCTQ {} uQt={}", this.query, uniqueQueryTerms);
    }
}

From source file:de.unioninvestment.eai.portal.portlet.crud.domain.model.CompoundSearch.java

License:Apache License

private List<Filter> convertBooleanClauses(Table table, BooleanQuery booleanQuery,
        boolean ignorePartialErrors) {
    List<Filter> subList = new ArrayList<Filter>(booleanQuery.getClauses().length);
    List<RuntimeException> errors = new LinkedList<RuntimeException>();
    for (BooleanClause clause : booleanQuery.clauses()) {
        try {/*w ww . j av  a  2  s .  c o m*/
            Filter subFilter = getFiltersForTable(table, clause.getQuery());
            if (subFilter != null) {
                if (clause.isProhibited()) {
                    subFilter = new Not(asList(subFilter));
                }
                subList.add(subFilter);
            }
        } catch (RuntimeException e) {
            errors.add(e);
        }
    }
    if (ignorePartialErrors) {
        if (errors.size() < booleanQuery.clauses().size()) {
            for (RuntimeException e : errors) {
                LOGGER.info("Ignoring error in 'OR' clause: " + e.getMessage());
            }
            return subList;
        }
    }
    if (errors.size() > 0) {
        throw errors.get(0);
    }
    return subList;
}

From source file:de.walware.statet.r.internal.core.rhelp.index.REnvIndexReader.java

License:Open Source License

public boolean search(final RHelpSearchQuery.Compiled query, final List<IRPkgHelp> packageList,
        final Map<String, IRPkgHelp> packageMap, final IRHelpSearchRequestor requestor) {
    check();//from  www  . ja va  2s  . c  o m
    try {
        final SearchQuery internal = (SearchQuery) query.compiled();
        final BooleanQuery q = internal.luceneQuery;
        if (q.clauses().size() <= 1) {
            for (final IRPkgHelp pkgHelp : packageList) {
                for (final IRHelpPage page : pkgHelp.getHelpPages()) {
                    requestor.matchFound(new RHelpSearchMatch(page, 1.0f));
                }
            }
        } else {
            final RequestStreamCollector collector = new RequestStreamCollector(packageMap, internal,
                    this.indexReader, requestor);
            this.indexSearcher.search(q, collector);
        }
        return true;
    } catch (final Exception e) {
        RCorePlugin.log(new Status(IStatus.ERROR, RCore.PLUGIN_ID, -1,
                "An error occurred in search: " + query.toString() + ".", e));
        return false;
    }
}

From source file:edu.rpi.tw.linkipedia.search.query.WeightedQuery.java

License:Open Source License

public Query getRelationQuery(String label, ArrayList<String> weightedContext) {

    //System.out.println(label+" context size: "+weightedContext.size());

    if (weightedContext.size() < 1)
        return null;

    BooleanQuery relationQuery = new BooleanQuery();
    for (int i = 0; i < weightedContext.size(); i++) {
        //System.out.println("value: "+weightedContext.get(i));
        String context = weightedContext.get(i);
        //String currentContext = contexts[i].replaceAll("\\(.*\\)", "");
        if (context.equals(label))
            continue;

        float weight = 1;
        if (context.contains("|")) {
            String[] termWeight = context.split("\\|");
            context = termWeight[0];/*  ww  w.  j a  v  a 2s. com*/
            weight = Float.parseFloat(termWeight[1]);
        }

        //if(weight > weightThreshold){
        Term contextTerm = new Term("related_object", context);
        PayloadTermQuery contextTermQuery = new PayloadTermQuery(contextTerm, payloadFunctionMax);
        contextTermQuery.setBoost(weight);
        if (label.equals("")) {
            relationQuery.add(contextTermQuery, BooleanClause.Occur.MUST);
        } else {
            relationQuery.add(contextTermQuery, BooleanClause.Occur.SHOULD);
        }
        //}
    }
    if (relationQuery.clauses().size() == 0)
        return null;

    return relationQuery;
}

From source file:eu.europeana.assets.service.ir.text.bm25f.query.BMBooleanQuery.java

License:Apache License

/**
 * Builds a query that will use BM25/BM25F ranking function
 * /*from  ww w  .  j  a v  a  2s.c o  m*/
 */
public BMBooleanQuery(String query, Analyzer analyzer, BMParameters bmParams)
        throws ParseException, IOException {
    QueryParser qp = new QueryParser(Version.LUCENE_29, bmParams.getMainField(), analyzer);
    Query q = qp.parse(query);
    this.bmParams = bmParams;

    if (q instanceof BooleanQuery) {
        BooleanQuery bq = (BooleanQuery) q;
        List<BooleanClause> clauses = bq.clauses();
        for (BooleanClause cl : clauses) {
            cl.getQuery().extractTerms(terms);
        }
    } else {
        q.extractTerms(terms);
    }
}

From source file:io.crate.execution.engine.collect.collectors.OptimizeQueryForSearchAfter.java

License:Apache License

@Override
public Query apply(FieldDoc lastCollected) {
    BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();
    for (int i = 0; i < orderBy.orderBySymbols().size(); i++) {
        Symbol order = orderBy.orderBySymbols().get(i);
        Object value = lastCollected.fields[i];
        if (order instanceof Reference) {
            final ColumnIdent columnIdent = ((Reference) order).column();
            if (columnIdent.isSystemColumn()) {
                // We can't optimize the initial query because the BooleanQuery
                // must not contain system columns.
                return null;
            }//from w w  w  .j  av  a  2s.co m
            boolean nullsFirst = orderBy.nullsFirst()[i] == null ? false : orderBy.nullsFirst()[i];
            value = value == null || value.equals(missingValues[i]) ? null : value;
            if (nullsFirst && value == null) {
                // no filter needed
                continue;
            }
            String columnName = columnIdent.fqn();
            MappedFieldType fieldType = requireNonNull(fieldTypeLookup.get(columnName),
                    "Column must exist: " + columnName);

            Query orderQuery;
            // nulls already gone, so they should be excluded
            if (nullsFirst) {
                BooleanQuery.Builder booleanQuery = new BooleanQuery.Builder();
                booleanQuery.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST);
                if (orderBy.reverseFlags()[i]) {
                    booleanQuery.add(
                            fieldType.rangeQuery(null, value, false, true, null, null, null, queryShardContext),
                            BooleanClause.Occur.MUST_NOT);
                } else {
                    booleanQuery.add(
                            fieldType.rangeQuery(value, null, true, false, null, null, null, queryShardContext),
                            BooleanClause.Occur.MUST_NOT);
                }
                orderQuery = booleanQuery.build();
            } else {
                if (orderBy.reverseFlags()[i]) {
                    orderQuery = fieldType.rangeQuery(value, null, false, false, null, null, null,
                            queryShardContext);
                } else {
                    orderQuery = fieldType.rangeQuery(null, value, false, false, null, null, null,
                            queryShardContext);
                }
            }
            queryBuilder.add(orderQuery, BooleanClause.Occur.MUST);
        }
    }
    BooleanQuery query = queryBuilder.build();
    if (query.clauses().size() > 0) {
        return query;
    } else {
        return null;
    }
}