如何在elasticsearch中按父字段和嵌套字段同时排序?

jtw3ybtb  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(518)

我需要在elasticsearch中同时按父字段和嵌套字段排序。我的数据如下:

[
    {
        "id": "1",
        "rank": 8,
        "price": 12.45,
        "offers": [
            {
                "id": "777",
                "rank": 12,
                "price": 45.75
            }
        ]
    },
    {
        "id": "2",
        "rank": 35,
        "price": 5.95,
        "offers": null
    }
]

我需要把结果分类 rankoffers 不是 null 我应该带你去 offers.rank 值,否则我就要做家长了 rank 价值观。我尝试了这个脚本,但没有成功:

"sort": [
        {
            "_script": {
                "script": {
                    "source": "doc['offers'].size()==0 ? doc['rank'].value : doc['offers.rank'].value",
                    "lang": "painless"
                },
                "type": "number",
                "order": "asc"
            }
        }
    ]

它不起作用可能是因为 offers.rank 是从嵌套的 offers 对象,该对象不可访问。但我不知道如何处理它-如果我为整个脚本添加嵌套条件,那么我的父值 doc['rank'].value 将无法访问。是否可以同时按父字段和嵌套字段排序?

llycmphe

llycmphe1#

你的假设是正确的,父等级将不可访问。现在,你也可以
创建两个单独的排序“对象”,一个用于父对象,一个用于嵌套的报价,然后使用排序模式或
迭代 _source 取而代之的是:

{
  "sort": [
    {
      "_script": {
        "script": {
          "source": """
          if (params._source.offers instanceof ArrayList
              && params._source.offers.length > 0) {
            return params._source['offers'][0].rank;
          }
          return params._source.rank
          """,
          "lang": "painless"
        },
        "type": "number",
        "order": "asc"
      }
    }
  ]
}

请注意,由于我们使用的是“offers” ArrayList 在这里,你需要某种机制来选择一个等级。这取决于您--我只是访问了第一个报价的排名,您可能需要对数组列表进行排序并选择最高的一个。。。
如果你喜欢的话,这里有一行:

params._source.offers instanceof ArrayList && params._source.offers.length > 0 ? params._source['offers'][0].rank : params._source.rank

相关问题