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:org.elasticsearch.test.unit.index.query.SimpleIndexQueryParserTests.java

License:Apache License

@Test
public void testQueryStringFields1Builder() throws Exception {
    IndexQueryParserService queryParser = queryParser();
    Query parsedQuery = queryParser.parse(queryString("test").field("content").field("name").useDisMax(false))
            .query();/*  w  w w .j  av  a  2s .co  m*/
    assertThat(parsedQuery, instanceOf(BooleanQuery.class));
    BooleanQuery bQuery = (BooleanQuery) parsedQuery;
    assertThat(bQuery.clauses().size(), equalTo(2));
    assertThat(((TermQuery) bQuery.clauses().get(0).getQuery()).getTerm(),
            equalTo(new Term("content", "test")));
    assertThat(((TermQuery) bQuery.clauses().get(1).getQuery()).getTerm(), equalTo(new Term("name", "test")));
}

From source file:org.elasticsearch.test.unit.index.query.SimpleIndexQueryParserTests.java

License:Apache License

@Test
public void testQueryStringFields1() throws Exception {
    IndexQueryParserService queryParser = queryParser();
    String query = copyToStringFromClasspath("/org/elasticsearch/test/unit/index/query/query-fields1.json");
    Query parsedQuery = queryParser.parse(query).query();
    assertThat(parsedQuery, instanceOf(BooleanQuery.class));
    BooleanQuery bQuery = (BooleanQuery) parsedQuery;
    assertThat(bQuery.clauses().size(), equalTo(2));
    assertThat(((TermQuery) bQuery.clauses().get(0).getQuery()).getTerm(),
            equalTo(new Term("content", "test")));
    assertThat(((TermQuery) bQuery.clauses().get(1).getQuery()).getTerm(), equalTo(new Term("name", "test")));
}

From source file:org.elasticsearch.test.unit.index.query.SimpleIndexQueryParserTests.java

License:Apache License

@Test
public void testQueryStringFieldsMatch() throws Exception {
    IndexQueryParserService queryParser = queryParser();
    String query = copyToStringFromClasspath(
            "/org/elasticsearch/test/unit/index/query/query-fields-match.json");
    Query parsedQuery = queryParser.parse(query).query();
    assertThat(parsedQuery, instanceOf(BooleanQuery.class));
    BooleanQuery bQuery = (BooleanQuery) parsedQuery;
    assertThat(bQuery.clauses().size(), equalTo(2));
    assertThat(((TermQuery) bQuery.clauses().get(0).getQuery()).getTerm(),
            equalTo(new Term("name.first", "test")));
    assertThat(((TermQuery) bQuery.clauses().get(1).getQuery()).getTerm(),
            equalTo(new Term("name.last", "test")));
}

From source file:org.elasticsearch.util.lucene.search.Queries.java

License:Apache License

public static void optimizeBooleanQuery(BooleanQuery optimized, BooleanQuery q) {
    for (BooleanClause clause : q.clauses()) {
        Query cq = clause.getQuery();
        cq.setBoost(cq.getBoost() * q.getBoost());
        if (cq instanceof BooleanQuery && !clause.isRequired() && !clause.isProhibited()) {
            optimizeBooleanQuery(optimized, (BooleanQuery) cq);
        } else {/*from www. ja v  a2s .c o  m*/
            optimized.add(clause);
        }
    }
}

From source file:org.elasticsearch.xpack.security.authz.accesscontrol.FieldExtractor.java

License:Open Source License

/**
 * Populates {@code fields} with the set of fields used by the query, or throws 
 * UnsupportedOperationException if it doesn't know how to do this.
 *//*w  w  w.j  a  v a  2 s . c o  m*/
static void extractFields(Query query, Set<String> fields) throws UnsupportedOperationException {
    // NOTE: we expect a rewritten query, so we only need logic for "atomic" queries here:
    if (query instanceof BooleanQuery) {
        // extract from all clauses
        BooleanQuery q = (BooleanQuery) query;
        for (BooleanClause clause : q.clauses()) {
            extractFields(clause.getQuery(), fields);
        }
    } else if (query instanceof DisjunctionMaxQuery) {
        // extract from all clauses
        DisjunctionMaxQuery q = (DisjunctionMaxQuery) query;
        for (Query clause : q.getDisjuncts()) {
            extractFields(clause, fields);
        }
    } else if (query instanceof SpanTermQuery) {
        // we just do SpanTerm, other spans are trickier, they could contain 
        // the evil FieldMaskingSpanQuery: so SpanQuery.getField cannot be trusted.
        fields.add(((SpanTermQuery) query).getField());
    } else if (query instanceof TermQuery) {
        fields.add(((TermQuery) query).getTerm().field());
    } else if (query instanceof SynonymQuery) {
        SynonymQuery q = (SynonymQuery) query;
        // all terms must have the same field
        fields.add(q.getTerms().get(0).field());
    } else if (query instanceof PhraseQuery) {
        PhraseQuery q = (PhraseQuery) query;
        // all terms must have the same field
        fields.add(q.getTerms()[0].field());
    } else if (query instanceof MultiPhraseQuery) {
        MultiPhraseQuery q = (MultiPhraseQuery) query;
        // all terms must have the same field
        fields.add(q.getTermArrays()[0][0].field());
    } else if (query instanceof PointRangeQuery) {
        fields.add(((PointRangeQuery) query).getField());
    } else if (query instanceof PointInSetQuery) {
        fields.add(((PointInSetQuery) query).getField());
    } else if (query instanceof DocValuesFieldExistsQuery) {
        fields.add(((DocValuesFieldExistsQuery) query).getField());
    } else if (query instanceof DocValuesNumbersQuery) {
        fields.add(((DocValuesNumbersQuery) query).getField());
    } else if (query instanceof IndexOrDocValuesQuery) {
        // Both queries are supposed to be equivalent, so if any of them can be extracted, we are good
        try {
            Set<String> dvQueryFields = new HashSet<>(1);
            extractFields(((IndexOrDocValuesQuery) query).getRandomAccessQuery(), dvQueryFields);
            fields.addAll(dvQueryFields);
        } catch (UnsupportedOperationException e) {
            extractFields(((IndexOrDocValuesQuery) query).getIndexQuery(), fields);
        }
    } else if (query instanceof TermInSetQuery) {
        // TermInSetQuery#field is inaccessible
        TermInSetQuery termInSetQuery = (TermInSetQuery) query;
        TermIterator termIterator = termInSetQuery.getTermData().iterator();
        // there should only be one field
        if (termIterator.next() != null) {
            fields.add(termIterator.field());
        }
    } else if (query instanceof MatchAllDocsQuery) {
        // no field
    } else if (query instanceof MatchNoDocsQuery) {
        // no field
    } else {
        throw new UnsupportedOperationException(); // we don't know how to get the fields from it
    }
}

From source file:org.eu.bitzone.Leia.java

License:Apache License

/** More Like this query from the current doc (or selected fields) */
public void actionMLT(final Object docNum, final Object docTable) {
    if (ir == null) {
        errorMsg(MSG_NOINDEX);//from   w w  w.  j a  v  a  2  s  . c o  m
        return;
    }
    int id = 0;
    try {
        id = Integer.parseInt(getString(docNum, "text"));
    } catch (final NumberFormatException nfe) {
        errorMsg("Invalid document number");
        return;
    }
    final MoreLikeThis mlt = new MoreLikeThis(ir);
    try {
        mlt.setFieldNames(Util.fieldNames(ir, true).toArray(new String[0]));
    } catch (final Exception e) {
        errorMsg("Exception collecting field names: " + e.toString());
        return;
    }
    mlt.setMinTermFreq(1);
    mlt.setMaxQueryTerms(50);
    final Analyzer a = createAnalyzer(find("srchOptTabs"));
    if (a == null) {
        return;
    }
    mlt.setAnalyzer(a);
    final Object[] rows = getSelectedItems(docTable);
    BooleanQuery similar = null;
    if (rows != null && rows.length > 0) {
        // collect text from fields
        final StringBuilder sb = new StringBuilder();
        for (int i = 0; i < rows.length; i++) {
            final Field f = (Field) getProperty(rows[i], "field");
            if (f == null) {
                continue;
            }
            final String s = f.stringValue();
            if (s == null || s.trim().length() == 0) {
                continue;
            }
            if (sb.length() > 0) {
                sb.append(" ");
            }
            sb.append(s);
        }
        try {
            similar = (BooleanQuery) mlt.like(new StringReader(sb.toString()), "field");
        } catch (final Exception e) {
            e.printStackTrace();
            errorMsg("FAILED: " + e.getMessage());
            return;
        }
    } else {
        try {
            similar = (BooleanQuery) mlt.like(id);
        } catch (final Exception e) {
            e.printStackTrace();
            errorMsg("FAILED: " + e.getMessage());
            return;
        }
    }
    if (similar.clauses() != null && similar.clauses().size() > 0) {
        // System.err.println("SIMILAR: " + similar);
        final Object tabpane = find("maintpane");
        setInteger(tabpane, "selected", 2);
        final Object qField = find("qField");
        setString(qField, "text", similar.toString());
    } else {
        showStatus("WARN: empty query - check Analyzer settings");
    }
}

From source file:org.fao.geonet.kernel.csw.services.getrecords.CatalogSearcher.java

License:Open Source License

/**
 * Creates a lucene Query object from a lucene query string using Lucene query syntax.
 *
 * @param cswServiceSpecificConstraint//from  w w w  .  java2  s. c  o m
 * @return
 * @throws ParseException
 */
public static Query getCswServiceSpecificConstraintQuery(String cswServiceSpecificConstraint)
        throws ParseException {

    Query q = new QueryParser(Version.LUCENE_30, "title", SearchManager.getAnalyzer())
            .parse(cswServiceSpecificConstraint);

    // List of lucene fields which MUST not be control by user, to be removed from the CSW service specific constraint
    List<String> SECURITY_FIELDS = Arrays.asList(LuceneIndexField.OWNER, LuceneIndexField.GROUP_OWNER);

    BooleanQuery bq = (BooleanQuery) q;

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

    Iterator<BooleanClause> it = clauses.iterator();
    while (it.hasNext()) {
        BooleanClause bc = it.next();

        for (String fieldName : SECURITY_FIELDS) {
            if (bc.getQuery().toString().contains(fieldName + ":")) {
                if (Log.isDebugEnabled(Geonet.CSW_SEARCH))
                    Log.debug(Geonet.CSW_SEARCH,
                            "LuceneSearcher getCswServiceSpecificConstraintQuery removed security field: "
                                    + fieldName);
                it.remove();

                break;
            }
        }
    }

    return q;
}

From source file:org.fao.geonet.kernel.search.LuceneQueryBuilder.java

License:Open Source License

private void addANDCriteria(String fieldName, Set<String> fieldValues, String similarity, BooleanQuery query,
        Map<String, Set<String>> searchCriteria, Set<String> processedRangeFields) {
    BooleanQuery bq = new BooleanQuery();
    BooleanClause.Occur qOccur = LuceneUtils.convertRequiredAndProhibitedToOccur(true, false);

    // Avoid search by field who control privileges
    if (UserQueryInput.SECURITY_FIELDS.contains(fieldName) || SearchParameter.EDITABLE.equals(fieldName)) {
        return;/*from w  w  w  . j  a va 2s  .  co  m*/
    }

    // whether a set of values is defined for this criteria
    boolean criteriaIsASet = fieldValues.size() > 1;

    // For each field value add a clause to the main query if not a set or no multi value like spatial search or
    // add to the boolean query (will be added to the main query after looping over all values).
    for (String fieldValue : fieldValues) {
        if (LuceneIndexField.ANY.equals(fieldName)) {
            addAnyTextQuery(fieldValue, similarity, (criteriaIsASet ? bq : query));
        } else if (LuceneIndexField.UUID.equals(fieldName) || SearchParameter.UUID.equals(fieldName)) {
            addUUIDQuery(fieldValue, similarity, criteriaIsASet, bq, query);
        } else if (LuceneIndexField.NORTH.equals(fieldName) || LuceneIndexField.SOUTH.equals(fieldName)
                || LuceneIndexField.EAST.equals(fieldName) || LuceneIndexField.WEST.equals(fieldName)
                || SearchParameter.RELATION.equals(fieldName)) {
            addBBoxQuery(searchCriteria, query);
        }
        // template
        else if (LuceneIndexField.IS_TEMPLATE.equals(fieldName) || SearchParameter.TEMPLATE.equals(fieldName)) {
            templateCriteria(fieldValue, query);
        }
        // all -- mapped to same Lucene field as 'any'
        else if ("all".equals(fieldName)) {
            addRequiredTextField(fieldValue, LuceneIndexField.ANY, similarity, (criteriaIsASet ? bq : query));
        }
        // or
        else if ("or".equals(fieldName)) {
            addNotRequiredTextField(fieldValue, LuceneIndexField.ANY, similarity,
                    (criteriaIsASet ? bq : query));
        }
        // without
        else if ("without".equals(fieldName)) {
            addProhibitedTextField(fieldValue, LuceneIndexField.ANY, (criteriaIsASet ? bq : query));
        }
        // phrase
        else if ("phrase".equals(fieldName)) {
            phraseCriteria(fieldValue, query, qOccur);
        }
        // temporal
        else if (SearchParameter.EXTFROM.equals(fieldName) || SearchParameter.EXTTO.equals(fieldName)) {
            if (!temporalCriteriaAdded) {
                temporalCriteriaAdded = temporalCriteria(searchCriteria, query);
            }
        }
        // range
        else if (UserQueryInput.RANGE_QUERY_FIELDS.contains(fieldName)) {
            rangeCriteria(searchCriteria, fieldName, query, processedRangeFields);
        }
        // featured
        else if (SearchParameter.FEATURED.equals(fieldName)) {
            featuredCriteria(fieldValue, bq);
        } else {
            if (criteriaIsASet) {
                // Add to the boolean query which will be added to the main query
                addNotRequiredTextField(fieldValue, fieldName, similarity, bq);
            } else if (fieldValue.contains(OR_SEPARATOR)) {
                // TODO : change OR separator
                // Add all separated values to the boolean query
                addSeparatedTextField(fieldValue, OR_SEPARATOR, fieldName, bq);
            } else {
                // Add the field to main query
                addRequiredTextField(fieldValue, fieldName, similarity, query);
            }
        }
    }

    // Add the boolean query created for the set of values for the current criteria
    if (bq.clauses().size() > 0) {
        query.add(bq, qOccur);
    }
}

From source file:org.fao.geonet.kernel.search.LuceneQueryBuilder.java

License:Open Source License

/**
 * Adds temporal searchterms to query.//from w w  w.j  av a  2  s. c o  m
 *
 * @param searchCriteria
 * @param query
 * @return
 */
private boolean temporalCriteria(Map<String, Set<String>> searchCriteria, BooleanQuery query) {
    //
    // Temporal extent : finds records where temporal extent overlaps the search extent
    //
    Set<String> from = searchCriteria.get(SearchParameter.EXTFROM);
    Set<String> to = searchCriteria.get(SearchParameter.EXTTO);

    String extTo = to != null ? (String) to.toArray()[0] : null;
    String extFrom = from != null ? (String) from.toArray()[0] : null;

    if (StringUtils.isNotBlank(extTo) || StringUtils.isNotBlank(extFrom)) {
        BooleanQuery temporalExtentQuery = new BooleanQuery();
        BooleanClause.Occur temporalExtentOccur = LuceneUtils.convertRequiredAndProhibitedToOccur(true, false);
        BooleanClause.Occur temporalRangeQueryOccur = LuceneUtils.convertRequiredAndProhibitedToOccur(false,
                false);

        TermRangeQuery temporalRangeQuery;

        // temporal extent start is within search extent
        temporalRangeQuery = new TermRangeQuery(LuceneIndexField.TEMPORALEXTENT_BEGIN, extFrom, extTo, true,
                true);
        BooleanClause temporalRangeQueryClause = new BooleanClause(temporalRangeQuery, temporalRangeQueryOccur);

        temporalExtentQuery.add(temporalRangeQueryClause);

        // or temporal extent end is within search extent
        temporalRangeQuery = new TermRangeQuery(LuceneIndexField.TEMPORALEXTENT_END, extFrom, extTo, true,
                true);
        temporalRangeQueryClause = new BooleanClause(temporalRangeQuery, temporalRangeQueryOccur);

        temporalExtentQuery.add(temporalRangeQueryClause);

        // or temporal extent contains search extent
        if (StringUtils.isNotBlank(extTo) && StringUtils.isNotBlank(extFrom)) {
            BooleanQuery tempQuery = new BooleanQuery();

            temporalRangeQuery = new TermRangeQuery(LuceneIndexField.TEMPORALEXTENT_END, extTo, null, true,
                    true);
            temporalRangeQueryClause = new BooleanClause(temporalRangeQuery, temporalExtentOccur);

            tempQuery.add(temporalRangeQueryClause);

            temporalRangeQuery = new TermRangeQuery(LuceneIndexField.TEMPORALEXTENT_BEGIN, null, extFrom, true,
                    true);
            temporalRangeQueryClause = new BooleanClause(temporalRangeQuery, temporalExtentOccur);
            tempQuery.add(temporalRangeQueryClause);

            temporalExtentQuery.add(tempQuery, temporalRangeQueryOccur);
        }

        if (temporalExtentQuery.clauses().size() > 0) {
            temporalRangeQueryClause = new BooleanClause(temporalExtentQuery, temporalExtentOccur);
            query.add(temporalRangeQueryClause);
        }
    }
    return true;
}

From source file:org.getopt.luke.Luke.java

License:Apache License

/** More Like this query from the current doc (or selected fields) */
public void actionMLT(Object docNum, Object docTable) {
    if (ir == null) {
        errorMsg(MSG_NOINDEX);//from  w w w  .ja v a 2s . c o  m
        return;
    }
    int id = 0;
    try {
        id = Integer.parseInt(getString(docNum, "text"));
    } catch (NumberFormatException nfe) {
        errorMsg("Invalid document number");
        return;
    }
    MoreLikeThis mlt = new MoreLikeThis(ir);
    try {
        mlt.setFieldNames((String[]) Util.fieldNames(ir, true).toArray(new String[0]));
    } catch (Exception e) {
        errorMsg("Exception collecting field names: " + e.toString());
        return;
    }
    mlt.setMinTermFreq(1);
    mlt.setMaxQueryTerms(50);
    Analyzer a = createAnalyzer(find("srchOptTabs"));
    if (a == null) {
        return;
    }
    mlt.setAnalyzer(a);
    Object[] rows = getSelectedItems(docTable);
    BooleanQuery similar = null;
    if (rows != null && rows.length > 0) {
        // collect text from fields
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < rows.length; i++) {
            Field f = (Field) getProperty(rows[i], "field");
            if (f == null) {
                continue;
            }
            String s = f.stringValue();
            if (s == null || s.trim().length() == 0) {
                continue;
            }
            if (sb.length() > 0)
                sb.append(" ");
            sb.append(s);
        }
        try {
            similar = (BooleanQuery) mlt.like(new StringReader(sb.toString()), "field");
        } catch (Exception e) {
            e.printStackTrace();
            errorMsg("FAILED: " + e.getMessage());
            return;
        }
    } else {
        try {
            similar = (BooleanQuery) mlt.like(id);
        } catch (Exception e) {
            e.printStackTrace();
            errorMsg("FAILED: " + e.getMessage());
            return;
        }
    }
    if (similar.clauses() != null && similar.clauses().size() > 0) {
        //System.err.println("SIMILAR: " + similar);
        Object tabpane = find("maintpane");
        setInteger(tabpane, "selected", 2);
        Object qField = find("qField");
        setString(qField, "text", similar.toString());
    } else {
        showStatus("WARN: empty query - check Analyzer settings");
    }
}