How do I create an "OR" filter using elasticsearch-dsl-py?
Solution:
s = Search(using=client, index="my_index" ).filter( "term", status=PUBLISHED ).filter( "or", [F("range", start_publication={"lte": now}, ), F("missing", field="start_publication")] ).filter( "or", [F("range", end_publication={"gte": now}, ), F("missing", field="end_publication")] )
Which turns into:
{ "query":{ "filtered":{ "filter":{ "bool":{ "must":[ { "term":{ "status":"published" } }, { "or":{ "filters":[ { "range":{ "start_publication":{ "lte":"2015-02-17T03:45:00.245012+00:00" } } }, { "missing":{ "field":"start_publication" } } ] } }, { "or":{ "filters":[ { "range":{ "end_publication":{ "gte":"2015-02-17T03:45:00.245012+00:00" } } }, { "missing":{ "field":"end_publication" } } ] } } ] } }, "query":{ "match_all":{ } } } }}
Hopefully this can be included in the elasticsearch-dsl-py documentation in the future.
With Elasticsearch 2.x (and elasticsearch-dsl > 2.x) you can't apply filters as in @theslow1's comment anymore. Instead you have to construct your filter by combining Q
s:
search = Search(using=esclient, index="myIndex")firstFilter = Q("match", color='blue') & Q("match", status='published')secondFilter = Q("match", color='yellow') & Q("match", author='John Doe')combinedFilter = firstFilter | secondFiltersearch = search.query('bool', filter=[combinedFilter])
The search.query('bool', filter=[combinedQ])
applies the Q-criteria as filter as described in the elasticsearch-dsl documentation.