Search code examples
djangoelasticsearchelasticsearch-dsl

How to run a combination of query and filter in elasticsearch?


I am experimenting using elasticsearch in a dummy project in django. I am attempting to make a search page using django-elasticsearch-dsl. The user may provide a title, summary and a score to search for. The search should match all the information given by the user, but if the user does not provide any info about something, this should be skipped.

I am running the following code to search for all the values.

client = Elasticsearch()

s = Search().using(client).query("match", title=title_value)\
    .query("match", summary=summary_value)\
    .filter('range', score={'gt': scorefrom_value, 'lte': scoreto_value})

When I have a value for all the fields then the search works correctly, but if for example I do not provide a value for the summary_value, although I am expecting the search to continue searching for the rest of the values, the result is that it comes up with nothing as a result.

Is there some value that the fields should have by default in case the user does not provide a value? Or how should I approach this?


UPDATE 1 I tried using the following, but it returns every time no matter the input i am giving the same results.

s = Search(using=client)

if title:
    s.query("match", title=title)

if summary:
    s.query("match", summary=summary)


response = s.execute()

UPDATE 2 I can print using the to_dict().
if it is like the following then s is empty

s = Search(using=client)
s.query("match", title=title)

if it is like this

s = Search(using=client).query("match", title=title)

then it works properly but still if i add s.query("match", summary=summary) it does nothing.


Solution

  • You need to assign back into s:

    if title:
        s = s.query("match", title=title)
    
    if summary:
        s = s.query("match", summary=summary)