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

Reply via email to