Erick, Thanks for taking a moment to address my question. I suspect the confusion expressed in the answer was from a slight transcription error that added additional punctuation.
In your reply, the query was expressed using fields (note the use of extra use of colons that changes the query meaning entirely): MEDICAL:CAT^10 OR ANIMAL:CAT I'm actually using the defaults and no custom fields, which without the colons makes MEDICAL and ANIMAL terms instead. Here's the original query: ( +MEDICAL CAT^2 ) OR ( +ANIMAL CAT^-2 ) Luke, which I was using to analyze this has a problem with the numerical value of negative two. So, let's rewrite the query using a different, parse-able, number, like zero: ( +MEDICAL CAT^2 ) OR ( +ANIMAL CAT^0 ) The question I'm trying to phrase is: Is there a way to make the rank of SHOULD term conditional? In the example, I'm trying to express "If the term MEDICAL is found, the term CAT ranks high; if the term ANIMAL is found, the term CAT ranks low." In your reply, you also stated, "Remember too that Lucene query logic isn't strictly Boolean..." This is my understanding as well, so I don't see how this could work at all. The users I'm dealing with are looking at the query as one might an expression in the C or Java language, where it either does the left half or the right half. My understanding is that the expression as a whole gets reduced to something else entirely. And that's where things get weird. According to Luke, I get two SHOULD clauses, each with a MUST and a SHOULD. As I understood things, a SHOULD *term* merely affects the ranking of the results, it doesn't affect what gets brought back. So I'm trying to understand what a SHOULD *clause* does in this case. More importantly, what does it logically mean to: "should have a must?" That's like saying I have an optional mandatory term. Or, is Lucene _really_ doing two separate sub-expressions? Looking at the data structures generated, it's flying counter to my understanding of what has to be happening under the hood. Perhaps Lucene really can do this afterall? And, if not, is there a programatic way to do directly with the API? Is it even possible to express this construct as a single expression or data structure for the API: 1. +( MEDICAL ANIMAL ) You must have either MEDICAL and/or ANIMAL. 2. If MEDICAL present, then CAT ranks high, else, if ANIMAL present, then CAT ranks low, otherwise the presence of the term CAT has no influence on rank. Many thanks, -wls