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:sh.isaac.provider.query.lucene.indexers.SemanticIndexer.java

License:Apache License

/**
 * Builds the numeric query./*from  w  ww.  j a  v a 2  s  . c  o  m*/
 *
 * @param queryDataLower the query data lower
 * @param queryDataLowerInclusive the query data lower inclusive
 * @param queryDataUpper the query data upper
 * @param queryDataUpperInclusive the query data upper inclusive
 * @param columnName the column name
 * @return the query
 */
private Query buildNumericQuery(DynamicData queryDataLower, DynamicData queryDataUpper, String columnName) {
    // Convert both to the same type (if they differ) - go largest data type to smallest, so we don't lose precision
    // Also - if they pass in longs that would fit in an int, also generate an int query.
    // likewise, with Double - if they pass in a double, that would fit in a float, also generate a float query.
    try {
        final BooleanQuery.Builder bqBuilder = new BooleanQuery.Builder();
        boolean fitsInFloat = false;
        boolean fitsInInt = false;

        if ((queryDataLower instanceof DynamicDouble) || (queryDataUpper instanceof DynamicDouble)) {
            final Double upperVal = ((queryDataUpper == null) ? null
                    : ((queryDataUpper instanceof DynamicDouble)
                            ? ((DynamicDouble) queryDataUpper).getDataDouble()
                            : ((Number) queryDataUpper.getDataObject()).doubleValue()));
            final Double lowerVal = ((queryDataLower == null) ? null
                    : ((queryDataLower instanceof DynamicDouble)
                            ? ((DynamicDouble) queryDataLower).getDataDouble()
                            : ((Number) queryDataLower.getDataObject()).doubleValue()));

            bqBuilder.add(DoublePoint.newRangeQuery(columnName, lowerVal, upperVal), Occur.SHOULD);

            if (((upperVal != null) && (upperVal <= Float.MAX_VALUE) && (upperVal >= Float.MIN_VALUE))
                    || ((lowerVal != null) && (lowerVal <= Float.MAX_VALUE) && (lowerVal >= Float.MIN_VALUE))) {
                fitsInFloat = true;
            }
        }

        if (fitsInFloat || (queryDataLower instanceof DynamicFloat)
                || (queryDataUpper instanceof DynamicFloat)) {
            final Float upperVal = ((queryDataUpper == null) ? null
                    : ((queryDataUpper == null) ? null
                            : ((queryDataUpper instanceof DynamicFloat)
                                    ? ((DynamicFloat) queryDataUpper).getDataFloat()
                                    : ((fitsInFloat && ((Number) queryDataUpper.getDataObject())
                                            .doubleValue() > Float.MAX_VALUE) ? Float.MAX_VALUE
                                                    : ((Number) queryDataUpper.getDataObject())
                                                            .floatValue()))));
            final Float lowerVal = ((queryDataLower == null) ? null
                    : ((queryDataLower instanceof DynamicFloat) ? ((DynamicFloat) queryDataLower).getDataFloat()
                            : ((fitsInFloat && ((Number) queryDataLower.getDataObject())
                                    .doubleValue() < Float.MIN_VALUE) ? Float.MIN_VALUE
                                            : ((Number) queryDataLower.getDataObject()).floatValue())));

            bqBuilder.add(FloatPoint.newRangeQuery(columnName, lowerVal, upperVal), Occur.SHOULD);
        }

        if ((queryDataLower instanceof DynamicLong) || (queryDataUpper instanceof DynamicLong)) {
            final Long upperVal = ((queryDataUpper == null) ? null
                    : ((queryDataUpper instanceof DynamicLong) ? ((DynamicLong) queryDataUpper).getDataLong()
                            : ((Number) queryDataUpper.getDataObject()).longValue()));
            final Long lowerVal = ((queryDataLower == null) ? null
                    : ((queryDataLower instanceof DynamicLong) ? ((DynamicLong) queryDataLower).getDataLong()
                            : ((Number) queryDataLower.getDataObject()).longValue()));

            bqBuilder.add(LongPoint.newRangeQuery(columnName, lowerVal, upperVal), Occur.SHOULD);

            if (((upperVal != null) && (upperVal <= Integer.MAX_VALUE) && (upperVal >= Integer.MIN_VALUE))
                    || ((lowerVal != null) && (lowerVal <= Integer.MAX_VALUE)
                            && (lowerVal >= Integer.MIN_VALUE))) {
                fitsInInt = true;
            }
        }

        if (fitsInInt || (queryDataLower instanceof DynamicInteger)
                || (queryDataUpper instanceof DynamicInteger) || (queryDataLower instanceof DynamicSequence)
                || (queryDataUpper instanceof DynamicSequence)) {
            final Integer upperVal = ((queryDataUpper == null) ? null
                    : ((queryDataUpper instanceof DynamicInteger)
                            ? ((DynamicInteger) queryDataUpper).getDataInteger()
                            : ((queryDataUpper instanceof DynamicSequence)
                                    ? ((DynamicSequence) queryDataUpper).getDataSequence()
                                    : ((fitsInInt && ((Number) queryDataUpper.getDataObject())
                                            .longValue() > Integer.MAX_VALUE) ? Integer.MAX_VALUE
                                                    : ((Number) queryDataUpper.getDataObject()).intValue()))));
            final Integer lowerVal = ((queryDataLower == null) ? null
                    : ((queryDataLower instanceof DynamicInteger)
                            ? ((DynamicInteger) queryDataLower).getDataInteger()
                            : ((queryDataLower instanceof DynamicSequence)
                                    ? ((DynamicSequence) queryDataLower).getDataSequence()
                                    : ((fitsInInt && ((Number) queryDataLower.getDataObject())
                                            .longValue() < Integer.MIN_VALUE) ? Integer.MIN_VALUE
                                                    : ((Number) queryDataLower.getDataObject()).intValue()))));

            bqBuilder.add(IntPoint.newRangeQuery(columnName, lowerVal, upperVal), Occur.SHOULD);
        }
        BooleanQuery bq = bqBuilder.build();
        if (bq.clauses().isEmpty()) {
            throw new RuntimeException("Not a numeric data type - can't perform a range query");
        } else {
            final BooleanQuery.Builder must = new BooleanQuery.Builder();

            must.add(bq, Occur.MUST);
            return must.build();
        }
    } catch (final ClassCastException e) {
        throw new RuntimeException(
                "One of the values is not a numeric data type - can't perform a range query");
    }
}

From source file:stroom.search.server.SearchExpressionQueryBuilder.java

License:Apache License

private Query getQuery(final Version matchVersion, final ExpressionItem item, final Set<String> terms) {
    if (item.enabled()) {
        if (item instanceof ExpressionTerm) {
            // Create queries for single terms.
            final ExpressionTerm term = (ExpressionTerm) item;
            return getTermQuery(term, matchVersion, terms);

        } else if (item instanceof ExpressionOperator) {
            // Create queries for expression tree nodes.
            final ExpressionOperator operator = (ExpressionOperator) item;
            if (hasChildren(operator)) {
                final List<Query> innerChildQueries = new ArrayList<>();
                for (final ExpressionItem childItem : operator.getChildren()) {
                    final Query childQuery = getQuery(matchVersion, childItem, terms);
                    if (childQuery != null) {
                        innerChildQueries.add(childQuery);
                    }/*w w w  .  ja  va  2  s.c  o m*/
                }

                if (innerChildQueries.size() > 0) {
                    final Occur occur = getOccur(operator);

                    if (innerChildQueries.size() == 1) {
                        final Query child = innerChildQueries.get(0);

                        // Add negation to single items if required.
                        if (Occur.MUST_NOT.equals(occur)) {
                            final Builder builder = new Builder();
                            builder.add(child, occur);
                            return builder.build();
                        }

                        return child;

                    } else {
                        final Builder builder = new Builder();
                        for (final Query child : innerChildQueries) {
                            if (Occur.MUST.equals(occur)) {
                                // If this is an AND then we can collapse
                                // down non OR child queries.
                                if (child instanceof BooleanQuery) {
                                    final BooleanQuery innerBoolean = (BooleanQuery) child;
                                    final Builder orTermsBuilder = new Builder();
                                    for (final BooleanClause clause : innerBoolean.clauses()) {
                                        if (Occur.MUST_NOT.equals(clause.getOccur())) {
                                            builder.add(clause.getQuery(), Occur.MUST_NOT);
                                        } else if (Occur.MUST.equals(clause.getOccur())) {
                                            builder.add(clause.getQuery(), Occur.MUST);
                                        } else {
                                            orTermsBuilder.add(clause);
                                        }
                                    }

                                    final BooleanQuery orTerms = orTermsBuilder.build();
                                    if (orTerms.clauses().size() > 0) {
                                        if (orTerms.clauses().size() == 1) {
                                            // Collapse single term.
                                            builder.add(orTerms.clauses().get(0).getQuery(), occur);
                                        } else {
                                            builder.add(orTerms, occur);
                                        }
                                    }

                                } else {
                                    builder.add(child, occur);
                                }
                            } else if (Occur.MUST_NOT.equals(occur)) {
                                // Remove double negation.
                                if (child instanceof BooleanQuery) {
                                    final BooleanQuery innerBoolean = (BooleanQuery) child;
                                    final Builder orTermsBuilder = new Builder();
                                    for (final BooleanClause clause : innerBoolean.clauses()) {
                                        if (Occur.MUST_NOT.equals(clause.getOccur())) {
                                            builder.add(clause.getQuery(), Occur.MUST);
                                        } else if (Occur.MUST.equals(clause.getOccur())) {
                                            builder.add(clause.getQuery(), Occur.MUST_NOT);
                                        } else {
                                            orTermsBuilder.add(clause);
                                        }
                                    }

                                    final BooleanQuery orTerms = orTermsBuilder.build();
                                    if (orTerms.clauses().size() > 0) {
                                        if (orTerms.clauses().size() == 1) {
                                            // Collapse single term.
                                            builder.add(orTerms.clauses().get(0).getQuery(), occur);
                                        } else {
                                            builder.add(orTerms, occur);
                                        }
                                    }

                                } else {
                                    builder.add(child, occur);
                                }
                            } else {
                                builder.add(child, occur);
                            }
                        }
                        return builder.build();
                    }
                }
            }
        }
    }

    return null;
}

From source file:stroom.search.server.SearchExpressionQueryBuilder.java

License:Apache License

private Query modifyOccurrence(final Query query, final Occur occur) {
    // Change all occurs to must as we want to insist that all terms exist
    // in the matched documents.
    if (query instanceof BooleanQuery) {
        final BooleanQuery bq = (BooleanQuery) query;
        final Builder builder = new Builder();
        for (final BooleanClause bc : bq.clauses()) {
            builder.add(bc.getQuery(), occur);
        }//from  w w  w  .ja va2  s  . c  o  m
        return builder.build();
    }
    return query;
}

From source file:uk.ac.ebi.arrayexpress.utils.search.BatchQueryConstructor.java

License:Apache License

private Query removeTermQueryForField(Query query, String fieldName) {
    if (query instanceof BooleanQuery) {
        BooleanQuery boolQuery = new BooleanQuery();
        for (BooleanClause clause : ((BooleanQuery) query).clauses()) {
            Query q = removeTermQueryForField(clause.getQuery(), fieldName);
            if (null != q) {
                boolQuery.add(q, clause.getOccur());
            }/* w  ww  .j  a v  a 2  s.c o m*/
            if (0 != boolQuery.clauses().size()) {
                query = boolQuery;
            } else {
                query = null;
            }
        }
    } else if (query instanceof TermQuery || query instanceof PhraseQuery) {
        Set<Term> terms = new HashSet<>();
        query.extractTerms(terms);
        for (Term term : terms) {
            if (fieldName.equals(term.field())) {
                return null;
            }
        }
    }
    return query;
}

From source file:uk.co.flax.luwak.presearcher.FieldFilterPresearcherComponent.java

License:Apache License

private Query buildFilterClause(LeafReader reader) throws IOException {

    Terms terms = reader.fields().terms(field);
    if (terms == null)
        return null;

    BooleanQuery.Builder bq = new BooleanQuery.Builder();

    int docsInBatch = reader.maxDoc();

    BytesRef term;/*from w  w  w .  ja  v  a2 s  .co  m*/
    TermsEnum te = terms.iterator();
    while ((term = te.next()) != null) {
        // we need to check that every document in the batch has the same field values, otherwise
        // this filtering will not work
        if (te.docFreq() != docsInBatch)
            throw new IllegalArgumentException("Some documents in this batch do not have a term value of "
                    + field + ":" + Term.toString(term));
        bq.add(new TermQuery(new Term(field, BytesRef.deepCopyOf(term))), BooleanClause.Occur.SHOULD);
    }

    BooleanQuery built = bq.build();

    if (built.clauses().size() == 0)
        return null;

    return built;
}

From source file:uk.co.flax.luwak.TestTermsEnumFilter.java

License:Apache License

@Test
public void testOnlyExistingTermsAreUsedInQuery() throws IOException {

    Monitor monitor = new Monitor(new LuceneQueryCache("f"), WildcardNGramPresearcher.DEFAULT);
    monitor.update(new MonitorQuery("1", "f:should"), new MonitorQuery("2", "+text:hello +text:world"));

    InputDocument doc = InputDocument.builder("doc")
            .addField("text", "this is a document about the world saying hello", ANALYZER)
            .addField("title", "but this text should be ignored", ANALYZER).build();

    BooleanQuery query = (BooleanQuery) monitor.buildQuery(doc);

    assertThat(query.clauses()).hasSize(1);
    assertThat(monitor.match(doc, SimpleMatcher.FACTORY).getMatchCount()).isEqualTo(1);

}