首页 > 解决方案 > 在嵌套对象内查询和排序

问题描述

我正在尝试根据嵌套对象内的字段对搜索结果进行排序。嵌套对象的映射如下所示:

{
  "metaDates": {
    "type": "nested",
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "qualifiers": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "value": {
        "type": "date",
        "format": "date_optional_time"
      }
    }
  }
}

因此,一个文档中可以有许多 metaDates 对象。这些通常如下所示:

{
  "metaDates": [
    {
      "name": "create-time",
      "value": "2020-06-03T13:14:11.556Z",
      "qualifiers": [
        "*"
      ]
    },
    {
      "name": "update-time",
      "value": "2020-06-03T13:14:11.556Z",
      "qualifiers": [
        "*"
      ]
    }
  ]
}

我想要实现的是根据创建时间或更新时间对结果进行排序。上升和/或下降。

我不能让它充分发挥作用。就目前而言,我不能强制它只查看给定的日期,在我看来,因为它验证了所有 metaDates 值,而不仅仅是我在订购时感兴趣的那个。(设置排序模式会影响结果,这就是我认为是这种情况的原因)

样本数据:

{
  "_index": "index-someitem-1630649750000",
  "_type": "_doc",
  "_id": "17",
  "_score": null,
  "_source": {
    "id": 17,
    "title": "test",
    "metaTexts": [
      {
        "name": "title",
        "value": "test",
        "qualifiers": [
          "en_US"
        ]
      }
    ],
    "metaDates": [
      {
        "name": "create-time",
        "value": "2020-06-03T13:14:24.502Z",
        "qualifiers": [
          "*"
        ]
      },
      {
        "name": "update-time",
        "value": "2020-06-03T13:14:29.140Z",
        "qualifiers": [
          "*"
        ]
      }
    ]
  },
  "sort": [
    1591190064502
  ]
}

我希望根据创建时间或更新时间(嵌套对象内部)对生成的文档进行排序

任何帮助深表感谢!谢谢

标签: elasticsearch

解决方案


对于将来发现此问题的任何人:通过更改数据格式、从方程式中删除嵌套对象来解决此问题。这意味着灵活性稍差,但查询更容易。


推荐阅读