how do i get `sort` and `bool => should` query to work in tandem?

Issue

I have the following query for fetching all products, what i’am trying to achieve is keep the out of stock products I.E. products with stock_sum = 0 at the bottom :-

{
  "sort": [
    {
      "updated_at": {
        "order": "desc"
      }
    }
  ],
  "size": 10,
  "from": 0,
  "query": {
    "bool": {
      "should": [
        {
          "range": {
            "stock_sum": {
              "gte": 1,
              "boost": 5
            }
          }
        }
      ]
    }
  }
}

But with the above query sort seems to completely override should , which is how its suppose to behave i guess, a couple of things that i tried are changing the should to must in this case the out of stock products, are left out completely (thats not what i want, i still want the out of stock products at the bottom).

Another approach is remove sort , and then the should query seems to have an effect , but again i need the sort. so my question is how do i get sort and bool => should query to work in tandem ? I.E. sort by updated_at but also keep the stock_sum = 0 at the bottom ?

Solution

Using match_all and constant_score query in the same should clause and sorting first by _score by asc, then by updated_at by desc should work for your example. Here is an example query:

{
  "sort": [
    {
      "_score": {
        "order": "asc"
      }
    },
    {
      "updated_at": {
        "order": "desc"
      }
    }
  ]
  "query": {
    "bool": {
      "should": [
        {
          "match_all": {}
        },
        {
          "constant_score": {
             "filter": {
              "term": {
                "stock_sum": 0
              }
            },
            "boost": 10
          }
        }
      ]
    }
  }
}

Answered By – YD9

Answer Checked By – Katrina (AngularFixing Volunteer)

Leave a Reply

Your email address will not be published.