algolia / algoliasearch-helper-flutter

⚡️ Building block to create instant-search applications with Flutter
https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/flutter/
Other
21 stars 14 forks source link

Question: Disjunctive Filters between Numeric and Facets #139

Open nerder opened 3 days ago

nerder commented 3 days ago

We are trying to create the following query:

status:active OR lastAttendedDate > 1700000000000

Our code looks like this:

filterState.add(FilterGroupID.or('someGroup'), [
  Filter.facet('status', "active"),
  Filter.comparison('date', NumericOperator.greaterOrEquals, 170000000),
]);

When we look at the query parameters produced tho, we got this status:active AND lastAttendedDate > 1700000000000

By looking at the internal code:

  String? sql(Set<FilterGroup> filterGroups) {
    final groups = filterGroups.whereNot((element) => element.isEmpty);
    if (groups.isEmpty) return null;
    return groups.map(_sqlGroup).join(' AND ');
  }

This function seems to be adding an AND between multiple-group, but in our case what is not obvious to us is why our filter is considered to be made of 2 groups, where we only have one. This seems to happen only when we use Filter.comparison or Filter.range.

Our expectation is that when we add a Disjuctive group that will be respected, but in this case it seems to be forced into a conjuctive one, why is that?

Some additional info is that all our facets are configured as filters only in the dashboard.

Any help?

nerder commented 3 days ago

Ok it seems like that this is intended as per the documentation: https://www.algolia.com/doc/guides/managing-results/refine-results/filtering/in-depth/combining-boolean-operators/#mixed-filter-types-in-or-conditions

Nonetheless it's quite an unexpected behaviour, I'd rather throw an error that point you to the documentation that "automagically" fix the query.