: Subject: Solr 4.4 Query ignoring null values

First off: it's important that you understand there is no such thing as a 
"null value" in a Solr index -- the concept does not exist.  You can have 
documents that "do not contain a value" for a field, and you can have 
documents that contain "the empty string" as an indexed value, but there 
is no such thing as querying for documents that have "null" indexed.

: 1. http://localhost:8180/solr/collection1/select?q=business_name:Catherine
: AND 
city:""&debugQuery=yes<http://158.151.155.224:8180/solr/firstcollection/select?q=business_name:Catherine&fq=physical_city:%22%22&debugQuery=yes>
:   -> 100 results
: In this query , I can see the city has no value and solr is automatically
: omitting it. Does this feature included in the previous solr versions also

You haven't shown us the output, so we can only guess as to what you mean 
by "the city has no value" (no value where? in the query string? in the 
debug output? in the stored fields of the results?)

I suspect that what's happening is this...

 * your city field is a TextField with an analyzer that produces no tokens 
for the input string ""
 * that means that the "city" clause of your query is a No-Op and the 100 
results you get are just teh 100 docs that match "business_name:Catherine"

: 3.  
http://localhost:8180/solr/collection1/select?q=<http://158.151.155.224:8180/solr/firstcollection/select?q=business_name:Catherine&fq=physical_city:%22%22&debugQuery=yes>
: 
business_name:Catherine<http://158.151.155.224:8180/solr/firstcollection/select?q=business_name:Catherine&fq=physical_city:%22%22&debugQuery=yes>&fq=city:""
:       -> 0 Results. If the first query works, why not the third?

In the first query, you have a No-Op 2nd clause -- not just a clause that 
doesn't match anything, but a clause that actually doesn't *mean* anything 
because the empty string doesn't produce any tokens from your analyzer, so 
it gets dropped by the query parser because there is no query to build 
from it -- but there is still the 1st clause which has meaning -- so as 
a result it is possible for documents to match that query, and 100 
documents do match.

In your 3rd URL you have a query (it happens to be an fq (filter query) 
but that's not important to the point) consisting of a single clause which 
is a No-Op -- so the resulting query is incapable of matching any 
documents.

...

If you want to be able to index documents containing the empty string ("") 
as a value, and then search for documents containing that value -- you 
need to use a field type / analyzer that respects and preserves the empty 
string as a legal field value.

If however you want to query (or filter) against documents that have a 
value, you should either:

  * index a special boolean field "has_city"
  * filter on a range query over all values, ie...
    *   fq=city:[* TO *]
    *   fq=-city:[* TO *]


-Hoss

Reply via email to