Elasticsearch按不同字段进行条件排序(某些字段可以为空)

frebpwbc  于 2022-12-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(242)

我有这样的对象:
{子状态:{更新日期:3 },状态更新时间:1 },
{子状态:空,状态更新时间:2)
我需要按如下方式有条件地对对象进行排序:如果subStatus字段存在,则相对于subStatus.updatedAt字段;如果subStatus字段不存在,则相对于statusUpdatedAt字段
如果两个字段都不存在,则对象应排序到列表末尾
我使用了以下查询:

"sort": {

      "_script": {

        "type": "number",

        "order": "asc",

        "script": {

          "lang": "painless",

          "source": "if(doc['subStatus'].value != null) { return doc['subStatus.updatedAt'].value } else { return doc['statusUpdatedAt'].value }"

          }

      }

    }

但我得到一个错误:“在类型为[]的Map中找不到[subStatus]的字段”
你能告诉我怎样解决这个问题吗?

mrwjdhj3

mrwjdhj31#

尝试按“大小”检查。

POST idx_fields/_bulk
{"index":{}}
{"subStatus": { "updatedAt": 3 }, "statusUpdatedAt": 1 }
{"index":{}}
{"subStatus": null, "statusUpdatedAt": 2 }

GET idx_fields/_search
{
  "sort": {
    "_script": {
      "type": "number",
      "order": "asc",
      "script": {
        "lang": "painless",
          "source": "if(doc['subStatus.updatedAt'].size() > 0) { return doc['subStatus.updatedAt'].value } else { return doc['statusUpdatedAt'].value }"
      }
    }
  }
}

相关问题