def filter(params = nil, &block)
      params = Filters.new(&block).__render__ if block
      chain { criteria.update_filters params }
    end
def filter(params = nil, &block)
      params = Filters.new(&block).__render__ if block
      chain { criteria.update_filters params }
    end
Adds one or more filter to the search request
 Internally filters are stored as an array
 While the full query compilation this array compiles
 according to `:filter_mode` option value

 By default it joins inside `and` filter
 See `#filter_mode` chainable method for more info.

 Also this method supports block DSL.
 See `Chewy::Query::Filters` for more info.

 @example
   UsersIndex.filter(term: {name: 'Johny'}).filter(range: {age: {lte: 42}})
   UsersIndex::User.filter(term: {name: 'Johny'}).filter(range: {age: {lte: 42}})
   UsersIndex.filter{ name == 'Johny' }.filter{ age <= 42 }
     # => {body: {query: {filtered: {
            query: {...},
            filter: {and: [{term: {name: 'Johny'}}, {range: {age: {lte: 42}}}]}
          }}}}

 If only one filter was specified, it will become a result
 filter as is, without joining.

 @example
   UsersIndex.filter(term: {name: 'Johny'})
     # => {body: {query: {filtered: {
            query: {...},
            filter: {term: {name: 'Johny'}}
          }}}}