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 ?
CodePudding user response:
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
}
}
]
}
}
}