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: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"); } }