On 4/26/2017 1:04 PM, Andy C wrote: > I'm looking at upgrading the version of Solr used with our application from > 5.3 to 6.5. > > Having an issue with a change in the behavior of one of the filter queries > we generate. > > The field "ctindex" is only present in a subset of documents. It basically > contains a user id. For those documents where it is present, I only want > documents returned where the ctindex value matches the id of the user > performing the search. Documents with no ctindex value should be returned > as well. > > This is implemented through a filter query that excludes documents that > contain some other value in the ctindex field: fq=(-ctindex:({* TO "MyId"} > OR {"MyId" TO *}))
I am surprised that this works in 5.3. The crux of the problem is that fully negative query clauses do not actually work. Here's the best-performing query that gives you the results you want: fq=ctindex:myId OR (*:* -ctindex:[* TO *]) The *:* is needed in the second clause to give the query a starting point of all documents, from which is subtracted all documents where ctindex has a value. Without the "all docs" starting point, you are subtracting from nothing, which yields nothing. You may notice that this query works perfectly, and wonder why: fq=-ctindex:[* TO *] This works because on such a simple query, Solr is able to detect that it is fully negated, so it implicitly adds the *:* starting point for you. As soon as you implement any kind of complexity (multiple clauses, parentheses, etc) that detection doesn't work. Thanks, Shawn