Hi Erick, thanks for the response! I've checked parsed queries in debug mode and there is following difference:
original query(this is value of the q parameter in the query) : (some_field:"hourly") AND (*:* AND -field_to_exclude:*) for edismax defType: (+(+(+some_field:hourly) +(+DisjunctionMaxQuery((doc_text_value:*\\:*)) -field_to_exclude:*)))/no_coord for default defType: +(+some_field:hourly) +(+MatchAllDocsQuery(*:*) -field_to_exclude:*) defType: How comes that edisMax defType parses *:* query as (doc_text_value:*\\:*)? What should I use instead? Also you've mentioned that field_to_exclude:* is inefficient when use in fq. Does it work the same if I use this clause in q? On Fri, Sep 11, 2020 at 9:18 PM Erick Erickson <erickerick...@gmail.com> wrote: > First, Solr does _not_ implement boolean logic. It can look like it, but > that’s sugar. > See: https://lucidworks.com/post/why-not-and-or-and-not/ > > As for (1), I haven’t a clue. If you’d provided the results of > adding &debug=query to the query, the parsed version > would have given us some pointers. > > (2) Yes, See the reference above. the NOT (-) operator is really > “from the results so far, remove everything that satisfies this clause”. > But just -field_to_exclude:[* TO *] has nothing to remove > things that satisfy this clause _from_. > > > And a couple of nits: > There’s no need for the AND, again, see the reference above. > ((*:* -field_to_exclude:*)) would work just fine. > > Second, and just to confuse you, the *:* is not required in fq > clauses, there’s some special logic to handle > fq=-field_to_exclude:* > that implies the *:* that you’d have to put in a “q” clause. > > Third, field_to_exclude:* is actually fairly inefficient, > fq=-field_to_exclude:[* TO *] > can be more efficient. The reasons are rather arcane... > > Best, > Erick > > > On Sep 11, 2020, at 10:18 AM, Iana Bondarska <yana2...@gmail.com> wrote: > > > > Hi everyone, > > I'm checking Solr query that contains condition "Exclude all documents > that > > contain ceratin field". > > Currently, it looks like this: > > *(*:* AND -field_to_exclude:*)* > > > > Full query is: > > *((some_other_field:"value") AND ((*:* AND -field_to_exclude:*)))* > > > > If I use defType=edismax, nothing is found. If I use default defType - I > > get correct results, same as when I do not specify *:* in non-exists > > condition. > > > > My questions are: > > 1) why defType "edismax" leads to empty results? > > 2) do we really need to include clause "**:**" in non-exists condition? > > Isn't *-field_to_exclude:* *enough? > > -- > > Best Regards, > > Iana Bondarska > > -- Best Regards, Iana Bondarska