: What I don't like is that it systematically uses the positive version. 
: Sometimes the negative version will give many less results (for example, 
: in some cases I filter by documents not having a given field, and there 
: are very few of them). I think it would be much better that solr 

the "positive" version of the filter is the only one that can be executed, 
so it's the one that gets cached today, but the principle you are 
describing is still sound -- in fact I'm pretty sure there is a note in 
the code about this exact idea as a possible performance enhancment:

if the cardinality of a filter is very large (regardless of wether the 
query was "positive" or "negative") it's negative relative the set of all 
docs could be cached in it's place to save space...

        ...but...

...the complication would comes later when doing lookups -- for cache 
lookups to work with an arbitrary query, you would either need to changed 
the cache structure from Query=>DocSet to a mapping of 
Query=>[DocSet,inverseionBit] and store the same cache value needs needs 
with two keys -- both the positive and the negative; or you keep the 
current cache structure, store whichever Query=>DocSet pair has the 
smallest cardinality, but then every logical cache lookup requires a 
second actual cache lookup under the covers (for the negation of the 
query) if the first one doesn't match anything.

it would require some benchmarking and hard decisions about whether the 
(hypothetical) memory savings are worth the (hypothetical) CPU cost.

: query that in fact returns the "negative" results. As a simple example, 
: I believe that, for a boolean field, -field:true is exactly the same as 
: +field:false, but the former is a negative query and the latter is a 

that's not strictly true in all cases... 

 * if the field is multivalued=true, a doc may contain both "false" and 
   "true" in "field", in which case it would match +field:false but it 
   would not match -field:true

 * if the field is not multivalued-false, and required=false, a doc
   may not contain any value, in which case it would match -field:true but 
   it would not match +field:false


-Hoss

Reply via email to