List of usage examples for org.apache.lucene.search BooleanClause isRequired
public boolean isRequired()
From source file:cn.b2b.index.product.index.ProductQueryOptimizer.java
private BooleanQuery filterQuery(Searcher searcher, BooleanQuery original, BooleanQuery query) throws IOException { BooleanQuery filterQuery = null;/*from w w w.j a v a 2s .c om*/ BooleanClause[] clauses = original.getClauses(); for (int i = 0; i < clauses.length; i++) { BooleanClause c = clauses[i]; if (c.isRequired() // required && c.getQuery().getBoost() == 0.0f // boost is zero && c.getQuery() instanceof TermQuery // TermQuery && (searcher.docFreq(((TermQuery) c.getQuery()).getTerm()) / (float) searcher.maxDoc()) >= threshold) { // check threshold if (filterQuery == null) filterQuery = new BooleanQuery(); // lucene1.4.3 -> lucene2.0.0 // filterQuery.add(c.getQuery(), true, false); // filter it filterQuery.add(c.getQuery(), BooleanClause.Occur.MUST); // filter // it } else { query.add(c); // query it } } return filterQuery; }
From source file:cn.b2b.index.product.index.ProductQueryOptimizer.java
@Override public Writable explain(IndexSearcher searcher, Writable param) throws Exception { ExplainParam queryParam = (ExplainParam) param; Query oriquery = queryParam.getQuery(); BooleanQuery original = QueryFilters.filter(oriquery, Constants.SLOP_SCORE_CVM_CLASS); BooleanQuery query = new BooleanQuery(); BooleanQuery filterQuery = null;/*from w w w. ja v a 2 s. co m*/ BooleanClause[] clauses = original.getClauses(); for (int i = 0; i < clauses.length; i++) { BooleanClause c = clauses[i]; if (c.isRequired() // required && c.getQuery().getBoost() == 0.0f // boost is zero && c.getQuery() instanceof TermQuery // TermQuery && (searcher.docFreq(((TermQuery) c.getQuery()).getTerm()) / (float) searcher.maxDoc()) >= threshold) { // check threshold if (filterQuery == null) filterQuery = new BooleanQuery(); // lucene1.4.3 -> lucene2.0.0 // filterQuery.add(c.getQuery(), true, false); // filter it filterQuery.add(c.getQuery(), BooleanClause.Occur.MUST); // filter // it } else { query.add(c); // query it } } Filter filter = null; if (filterQuery != null) { synchronized (cache) { // check cache filter = (Filter) cache.get(filterQuery); } if (filter == null) { // miss filter = new QueryFilter(filterQuery); // construct new entry synchronized (cache) { cache.put(filterQuery, filter); // cache it } } } ScoreParam scoreParam = new ScoreParam(); // store segment query word query.setQueryStr(original.getQueryStr()); float[] ranks = (float[]) MemoryFieldCache.get("rank"); Explanation explain = searcher.explain(query, queryParam.getDoc()); return new UTF8("RANK:" + ranks[queryParam.getDoc()] + "\t" + explain.toString()); }
From source file:com.browseengine.bobo.search.section.SectionSearchQueryPlanBuilder.java
License:Apache License
private SectionSearchQueryPlan translateBooleanQuery(BooleanQuery query) throws IOException { ArrayList<Query> requiredClauses = new ArrayList<Query>(); ArrayList<Query> prohibitedClauses = new ArrayList<Query>(); ArrayList<Query> optionalClauses = new ArrayList<Query>(); BooleanClause[] clauses = query.getClauses(); for (BooleanClause clause : clauses) { if (clause.isRequired()) { requiredClauses.add(clause.getQuery()); } else if (clause.isProhibited()) { prohibitedClauses.add(clause.getQuery()); } else {//from w ww .j a v a 2 s . com optionalClauses.add(clause.getQuery()); } } SectionSearchQueryPlan positiveNode = null; SectionSearchQueryPlan negativeNode = null; if (requiredClauses.size() > 0) { if (requiredClauses.size() == 1) { positiveNode = translate(requiredClauses.get(0)); } else { SectionSearchQueryPlan[] subqueries = translate(requiredClauses); if (subqueries != null && subqueries.length > 0) positiveNode = new AndNode(subqueries); } } else if (optionalClauses.size() > 0) { if (optionalClauses.size() == 1) { positiveNode = translate(optionalClauses.get(0)); } else { SectionSearchQueryPlan[] subqueries = translate(optionalClauses); if (subqueries != null && subqueries.length > 0) positiveNode = new OrNode(subqueries); } } if (prohibitedClauses.size() > 0) { if (prohibitedClauses.size() == 1) { negativeNode = translate(prohibitedClauses.get(0)); } else { negativeNode = new OrNode(translate(prohibitedClauses)); } } if (negativeNode == null) { return positiveNode; } else { if (positiveNode == null) { return new UnaryNotNode(negativeNode); } else { return new AndNotNode(positiveNode, negativeNode); } } }
From source file:com.zimbra.cs.index.LuceneQueryOperation.java
License:Open Source License
private Query expandLazyMultiPhraseQuery(Query query) throws IOException { if (query instanceof LazyMultiPhraseQuery) { LazyMultiPhraseQuery lazy = (LazyMultiPhraseQuery) query; int max = LC.zimbra_index_wildcard_max_terms_expanded.intValue(); MultiPhraseQuery mquery = new MultiPhraseQuery(); for (Term[] terms : lazy.getTermArrays()) { if (terms.length != 1) { mquery.add(terms);/* www . j a v a 2s .co m*/ continue; } Term base = terms[0]; if (!lazy.expand.contains(base)) { mquery.add(terms); continue; } List<Term> expanded = Lists.newArrayList(); TermFieldEnumeration itr = searcher.getIndexReader().getTermsForField(base.field(), base.text()); try { while (itr.hasMoreElements()) { BrowseTerm term = itr.nextElement(); if (term != null && term.getText().startsWith(base.text())) { if (expanded.size() >= max) { // too many terms expanded break; } expanded.add(new Term(base.field(), term.getText())); } else { break; } } } finally { Closeables.closeQuietly(itr); } if (expanded.isEmpty()) { return null; } else { mquery.add(expanded.toArray(new Term[expanded.size()])); } } return mquery; } else if (query instanceof BooleanQuery) { ListIterator<BooleanClause> itr = ((BooleanQuery) query).clauses().listIterator(); while (itr.hasNext()) { BooleanClause clause = itr.next(); Query result = expandLazyMultiPhraseQuery(clause.getQuery()); if (result == null) { if (clause.isRequired()) { return null; } else { itr.remove(); } } else if (result != clause.getQuery()) { clause.setQuery(result); } } return ((BooleanQuery) query).clauses().isEmpty() ? null : query; } else { return query; } }
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.joergjahnke.jdesktopsearch.abstractionlayer.SQLServerIndexManager.java
License:Open Source License
/** * Get SQL queries' WHERE-clause/* w ww . j a v a 2 s . co m*/ * * @param query Lucene query to translate into a SQL WHERE-clause * @param logicalOperator logical operator to use when connecting the results of the query to an existing WHERE-clause * @param termQuery SQL query fragment to use * @return list of strings where the first entry is an SQL query that can be used in a PreparedStatement. The following * strings are to be set as parameters for this PreparedStatement. */ private WhereClauseParameters getSQLWhereClause(final Query query, String logicalOperator, final String termQuery) { if (DEBUG) System.err.println(this.getClass().getName() + ": Query-Class: " + query.getClass()); if (DEBUG) System.err.println(this.getClass().getName() + ": Query: " + query); final List<String> params = new LinkedList<String>(); final StringBuffer sql = new StringBuffer(); // process BooleanQuerys // these contain of two subqueries which have to be connected by a logical operator if (query instanceof BooleanQuery) { boolean brackedOpened = false; final List<String> sqlList = new LinkedList<String>(); final List<Collection<String>> paramsList = new LinkedList<Collection<String>>(); for (BooleanClause clause : ((BooleanQuery) query).getClauses()) { if (DEBUG) System.err.println(this.getClass().getName() + ": BooleanClause: p: " + clause.isProhibited() + ", r: " + clause.isRequired()); if (clause.isProhibited()) { if (!"AND NOT".equals(logicalOperator)) { sql.append(" " + logicalOperator + " NOT ( 1=1"); brackedOpened = true; appendToWhereClause(sqlList, paramsList, sql, params); } final WhereClauseParameters subQuery = getSQLWhereClause(clause.getQuery(), "AND", termQuery); sqlList.add(subQuery.getSQL()); paramsList.add(subQuery.getParameters()); logicalOperator = "AND NOT"; } else if (clause.isRequired()) { if (!"AND".equals(logicalOperator)) { sql.append(" " + logicalOperator + " ( 1=1"); brackedOpened = true; appendToWhereClause(sqlList, paramsList, sql, params); } final WhereClauseParameters subQuery = getSQLWhereClause(clause.getQuery(), "AND", termQuery); sqlList.add(subQuery.getSQL()); paramsList.add(subQuery.getParameters()); logicalOperator = "AND"; } else { if (!"OR".equals(logicalOperator)) { sql.append(" " + logicalOperator + " ( 1=2"); brackedOpened = true; appendToWhereClause(sqlList, paramsList, sql, params); } final WhereClauseParameters subQuery = getSQLWhereClause(clause.getQuery(), "OR", termQuery); sqlList.add(subQuery.getSQL()); paramsList.add(subQuery.getParameters()); logicalOperator = "OR"; } } // not all parts of the query has already been added if (!sqlList.isEmpty()) { if ("OR".equals(logicalOperator)) { optimizeQuery(sqlList, paramsList); } if (DEBUG) System.err.println(this.getClass().getName() + ": AfterOptimization: New SQL= " + sql); if (DEBUG) System.err .println(this.getClass().getName() + ": AfterOptimization: New Parameters= " + params); // then add the rest appendToWhereClause(sqlList, paramsList, sql, params); if (DEBUG) System.err.println(this.getClass().getName() + ": AfterOptimization: New SQL= " + sql); if (DEBUG) System.err .println(this.getClass().getName() + ": AfterOptimization: New Parameters= " + params); } // a bracket has been opened if (brackedOpened) { // then only close the bracket sql.append(" )"); } // process TermQuery, WildCardQuery or PrefixQuery // these contain a single term which needs to be matched and may contain one or more wildcards } else if (query instanceof TermQuery || query instanceof WildcardQuery || query instanceof PrefixQuery) { processTermQuery(sql, params, query, logicalOperator, termQuery); // process PhraseQuery // such a query contains a set phrase } else if (query instanceof PhraseQuery) { processPhraseQuery(sql, params, query, logicalOperator, termQuery); // process RangeQuery // such a query contains an upper and lower boundary wherein the results may lie } else if (query instanceof RangeQuery) { processRangeQuery(sql, params, query, logicalOperator, termQuery); } else { throw new RuntimeException("Query type '" + query.getClass() + "' not supported!"); } if (DEBUG) System.err.println(this.getClass().getName() + ": SQL= " + sql); if (DEBUG) System.err.println(this.getClass().getName() + ": Params= " + params); return new WhereClauseParameters(sql.toString(), params); }
From source file:it.unibz.instasearch.indexing.querying.PhraseSearcher.java
License:Open Source License
@Override public BooleanQuery visit(BooleanQuery boolQuery) { PhraseQuery phraseQuery = new PhraseQuery(); for (BooleanClause clause : boolQuery.getClauses()) { if (clause.isProhibited() || !clause.isRequired() || !(clause.getQuery() instanceof TermQuery)) return super.visit(boolQuery); // only consider required terms TermQuery tq = (TermQuery) clause.getQuery(); Field field = Field.getByName(tq.getTerm().field()); if (field != Field.CONTENTS) continue; phraseQuery.add(tq.getTerm());/*from w ww . ja v a2 s . co m*/ } phraseQuery.setSlop(DEFAULT_SLOP); BooleanQuery bq = new BooleanQuery(); bq.add(phraseQuery, Occur.SHOULD); bq.add(boolQuery, Occur.SHOULD); bq.setBoost(boolQuery.getBoost()); phraseQuery.setBoost(boolQuery.getBoost()); boolQuery.setBoost(phraseQuery.getBoost() * 0.5f); return bq; }
From source file:org.apache.jackrabbit.core.query.lucene.LuceneQueryBuilder.java
License:Apache License
public Object visit(OrQueryNode node, Object data) throws RepositoryException { BooleanQuery orQuery = new BooleanQuery(); Object[] result = node.acceptOperands(this, null); for (Object aResult : result) { Query operand = (Query) aResult; if (operand instanceof BooleanQuery) { // check if the clauses are all optional, then // we can collapse into the the enclosing orQuery boolean hasNonOptional = false; for (BooleanClause clause : ((BooleanQuery) operand).getClauses()) { if (clause.isProhibited() || clause.isRequired()) { hasNonOptional = true; break; }//from ww w . ja va 2s . c om } if (hasNonOptional) { // cannot collapse orQuery.add(operand, Occur.SHOULD); } else { // collapse for (BooleanClause clause : ((BooleanQuery) operand).getClauses()) { orQuery.add(clause); } } } else { orQuery.add(operand, Occur.SHOULD); } } return orQuery; }
From source file:org.apache.nutch.searcher.LuceneQueryOptimizer.java
License:Apache License
public TopDocs optimize(BooleanQuery original, Searcher searcher, int numHits, String sortField, boolean reverse) throws IOException { BooleanQuery query = new BooleanQuery(); Filter filter = null;/*from w w w.j a v a2s. c o m*/ BooleanClause[] clauses = original.getClauses(); for (int i = 0; i < clauses.length; i++) { BooleanClause c = clauses[i]; if (c.isRequired() && c.getQuery().getBoost() == 0.0f) { // boost is zero if (c.getQuery() instanceof TermQuery // TermQuery && (searcher.docFreq(((TermQuery) c.getQuery()).getTerm()) / (float) searcher.maxDoc()) < threshold) { // beneath threshold query.add(c); } else if (c.getQuery() instanceof RangeQuery) { // RangeQuery query.add(c); } } else { query.add(c); // query it } } query.setFunctions(original.getFunctions()); if (sortField != null) { // to sort result by sortField query.add(new PwaSortQuery(sortField, reverse), BooleanClause.Occur.MUST); } // print query LOG.info("Query:" + query.toString()); // no hit limit if (this.maxFulltextMatchesRanked <= 0 && timerThread == null) { return searcher.search(query, filter, numHits); } // hits limited in time or in count -- use a LimitedCollector LimitedCollector collector = new LimitedCollector(numHits, maxFulltextMatchesRanked, maxTickCount, timerThread, (sortField != null) ? !reverse : reverse); LimitExceeded exceeded = null; TimeExceeded timeExceeded = null; try { searcher.search(query, filter, collector); } catch (LimitExceeded le) { exceeded = le; } catch (TimeExceeded te) { timeExceeded = te; } TopDocs results = collector.topDocs(); if (exceeded != null) { // limit was exceeded results.totalHits = (int) (results.totalHits * (searcher.maxDoc() / (float) exceeded.maxDoc)); // estimate totalHits } else if (timeExceeded != null) { results.totalHits = (int) (results.totalHits * (searcher.maxDoc() / (float) timeExceeded.maxDoc)); } return results; }
From source file:org.apache.nutch.searcher.SolrSearchBean.java
License:Apache License
private static String stringify(BooleanQuery bQuery) { final StringBuilder buffer = new StringBuilder(); final boolean needParens = (bQuery.getBoost() != 1.0) || (bQuery.getMinimumNumberShouldMatch() > 0); if (needParens) { buffer.append("("); }/*from ww w . j ava 2 s . c o m*/ final BooleanClause[] clauses = bQuery.getClauses(); int i = 0; for (final BooleanClause c : clauses) { if (c.isProhibited()) buffer.append("-"); else if (c.isRequired()) buffer.append("+"); final org.apache.lucene.search.Query subQuery = c.getQuery(); if (subQuery instanceof BooleanQuery) { // wrap sub-bools in parens buffer.append("("); buffer.append(c.getQuery().toString("")); buffer.append(")"); } else if (subQuery instanceof TermQuery) { final Term term = ((TermQuery) subQuery).getTerm(); buffer.append(term.field()); buffer.append(":\""); buffer.append(term.text()); buffer.append("\""); } else { buffer.append(" "); buffer.append(c.getQuery().toString()); } if (i++ != clauses.length - 1) { buffer.append(" "); } } if (needParens) { buffer.append(")"); } if (bQuery.getMinimumNumberShouldMatch() > 0) { buffer.append('~'); buffer.append(bQuery.getMinimumNumberShouldMatch()); } if (bQuery.getBoost() != 1.0f) { buffer.append(ToStringUtils.boost(bQuery.getBoost())); } return buffer.toString(); }