List of usage examples for org.apache.lucene.search BooleanQuery clauses
List clauses
To view the source code for org.apache.lucene.search BooleanQuery clauses.
Click Source Link
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); }