【问题标题】:Elasticsearch sorting by array of objectsElasticsearch 按对象数组排序
【发布时间】:2018-02-21 07:52:21
【问题描述】:

我有一个这样的列参与度以及其他列

记录 1

"date":"2017-11-23T06:46:04.358Z",
"remarks": "test1",
"engagement": [
    {
      "name": "comment_count",
      "value": 6
    },
    {
      "name": "like_count",
      "value": 2
    }
  ],
  ....
  ....

记录 2

  "date":"2017-11-23T07:16:14.358Z",
  "remarks": "test2",
  "engagement": [
    {
    "name": "comment_count",
    "value": 3
    },
    {
    "name": "like_count",
    "value": 9
    }
  ],
  ....
  ....

我以数组格式存储对象,现在我想按任何给定对象名称的 desc 顺序对数据进行排序,例如like_count 的值或 share_count 的值。

所以如果我按 like_count 排序,那么 2nd 记录应该在第一条记录之前,因为 2nd 记录的 like_count 值为 9与第一条记录的like_count的值2相比。

如何在 elasticsearch 中做到这一点?

【问题讨论】:

  • Pfff,如果你有一个单独的字段来组合值本身和名称,你会更好地对其进行排序。
  • 你那里有一组已知的names 吗?例如,可以创建一个名为 like_count_value 的字段,该字段应包含类似 9_like_count 的值?
  • 我有多种参与度值(例如,share_count、追随者、关注者、到达率等),所以如果我创建列,那么每次出现新的参与度键时我都必须创建新列。当前结构支持任何类型的参与值,而无需通过在数组中附加键/值来创建新列。
  • 我理解你所说的,我理解这样更舒服:-)。但是,就性能而言,你不会有更好的方式。
  • 我得到了类似的东西,但它没有按预期工作。 { "_source": ["engagement"], "sort": { "engagement.value": { "order": "desc", "nested_filter": { "term": { "engagement.name": "like_count" } } } } }

标签: elasticsearch


【解决方案1】:

你应该有如下内容:

{
  "query": {
    "nested": { 
      "path": "engagement",
      "filter": {
        ...somefilter...
      }
    }
  },
  "sort": {
    "engagement.name": { 
      "order": "desc",   
      "mode":  "min",   
      "nested_filter": { 
        ...same.filter.as.before
      }
    }
  }
}

来源:Elastic Docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2017-01-13
    • 2020-07-11
    相关资源
    最近更新 更多