: The following query does not work as expected for me: : "alwaysTrueField:true (-name:john)" : neither does this: : "alwaysTrueField:true +(-name:john)"
: Does lucene run a sub-query for each part of the query inside : parentheses, which is why the NOT query that is alone doesn't work? I am Basically yes, the parens force the creation of a BooleanQuery, which is invalid since it only contains prohited clauses. : Any suggestions on how to work around this (buggy?) behaviour? I use the following (1.4.3) method to deal with situations like this... /** * tests a BooleanQuery to see if it is directly usable, meaning it * has at least one clause that is not prohibited. * * @param bq a BooleanQuery to test * @returns false if bq null or contains all prohibited items, else true */ public static boolean usableBooleanQuery(BooleanQuery bq) { if (null == bq) { return false; } /* if we find *1* clause that's not prohibited, return true */ BooleanClause[] clauses = bq.getClauses(); for (int c = 0; clauses != null && c < clauses.length; c++) { if (! clauses[c].prohibited) { return true; } } return false; } It can be used something like this... Query at = new TermQuery(new Term("alwaysTrueField","true)); Query user = queryParser.parse(userInput); if (user instanceof BooleanQuery) { BooleanQuery bq = (BooleanQuery)user; if (! usableBooleanQuery(bq)) { bq.add(at, true, false); /* add 'always true' clause directly */ return bq; } } /* if we made it here, wrape both clauses. BooleanQuery q = new BooleanQuery(); q.add(at, true, false); q.add(user, true, false); return q; (i think that's right, the specific cases where i use it are more complicated so i can't cut/paste ... but i'm pretty sure the logic is correct in that example, you should write some unit tests to be sure before you do something like this.) -Hoss --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]