在Elasticsearch中对嵌套对象进行排序

10
我正在使用以下映射:
PUT /my_index
{
  "mappings": {
    "blogpost": {
      "properties": {
        "title": {"type": "string"}
        "comments": {
          "type": "nested", 
          "properties": {
            "comment": { "type": "string"  },
            "date":    { "type": "date"    }
          }
        }
      }
    }
  }
}

文档示例:

PUT /my_index/blogpost/1
{
  "title": "Nest eggs",
  "comments": [ 
    {
      "comment": "Great article",
      "date":    "2014-09-01"
    },
    {
      "comment": "More like this please",
      "date":    "2014-10-22"
    },
    {
      "comment": "Visit my website",
      "date":    "2014-07-02"
    },
    {
      "comment": "Awesome",
      "date":    "2014-08-23"
    }
  ]
}

我的问题是如何检索这个文档,并按“日期”排序嵌套对象“评论”?结果:

PUT /my_index/blogpost/1
{
  "title": "Nest eggs",
  "comments": [ 
    {
      "comment": "Awesome",
      "date":    "2014-07-23"
    },
    {
      "comment": "Visit my website",
      "date":    "2014-08-02"
    },
    {
      "comment": "Great article",
      "date":    "2014-09-01"
    },
    {
      "comment": "More like this please",
      "date":    "2014-10-22"
    }
  ]
}

你正在使用哪个版本的ES?这很奇怪,我按照此链接所述操作,但它并没有起作用。我不确定这是否是一个bug,可能与这个问题有关。 - ChintanShah25
这不是我的问题,我不想按嵌套字段过滤,我想按嵌套字段排序。ES版本1.7。 - Akram Fares
1个回答

15
你需要在inner_hits上进行排序,以对nested objects进行排序。这样可以获得所需的输出。
GET my_index/_search
{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "match_all": {}
      },
      "inner_hits": {
        "sort": {
          "comments.date": {
            "order": "asc"
          }
        },
        "size": 5
      }
    }
  },
  "_source": [
    "title"
  ]
}

我正在使用源过滤来仅获取"title"作为comments将在inner_hit中检索,但如果您愿意,可以避免这种情况。

size是5,因为默认值为3,而在给定的示例中我们有4个对象。

希望这可以帮到你!


所以这里的 size 仅限制要显示多少条评论(按日期排序)?因此,如果我指定 "size": 1,那么我会得到第一条(最旧的)消息,对吗?提前感谢! - Artem Bernatskyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接