如何让`sort`和`bool=>should`查询协同工作?

nom7f22z  于 2022-10-06  发布在  ElasticSearch
关注(0)|答案(1)|浏览(203)

我有以下关于获取所有产品的查询。我想要实现的是保持缺货产品,即底部带有stock_sum=0的产品:

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

但在上面的查询中,sort似乎完全覆盖了should,我想这就是它应该如何行为的。我尝试了几项措施,将should更改为must,在本例中,将缺货产品完全省略(这不是我想要的,我仍然希望将缺货产品放在底部)。

另一种方法是删除排序,然后应该查询似乎有效果,但我同样需要排序。因此,我的问题是如何让sortbool => should查询协同工作?即按updated_at排序,但同时将stock_sum = 0留在底部?

0yg35tkg

0yg35tkg1#

在同一个should子句中使用match_allconstant_score查询,并首先按asc_score排序,然后按descupdated_at排序,这对您的示例应该有效。以下是一个示例查询:

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

相关问题