【问题标题】:How to group distinct records in Elasticsearch如何在 Elasticsearch 中对不同的记录进行分组
【发布时间】:2021-06-01 00:01:40
【问题描述】:

我的 Elasticsearch 索引中有以下数据:

{
  "title": "Hello from elastic",
  "name": "ABC",
  "j_id": "1",
  "date": '2021-03-02T12:29:31.356514'
},
{
  "title": "Hello from elastic",
  "name": "PQR",
  "j_id": "1",
  "date": '2021-03-02T12:29:31.356514'
},
{
  "title": "Hello from elastic",
  "name": "XYZ",
  "j_id": "2",
  "date": '2021-03-02T12:29:31.356514'
},
{
  "title": "Hello from elastic",
  "name": "MNO",
  "j_id": "3",
  "date": '2021-03-02T12:29:31.356514'
}

现在我想根据id获取唯一记录。

预期的输出是:

{
    "1": [{
      "title": "Hello from elastic",
      "name": "ABC",
      "j_id": "1",
      "date": '2021-03-02T12:29:31.356514'
    },
    {
      "title": "Hello from elastic",
      "name": "PQR",
      "j_id": "1",
      "date": '2021-03-02T12:29:31.356514'
    }],
    "2": [{
      "title": "Hello from elastic",
      "name": "XYZ",
      "j_id": "2",
      "date": '2021-03-02T12:29:31.356514'
    }],
    "3": [{
      "title": "Hello from elastic",
      "name": "MNO",
      "j_id": "3",
      "date": '2021-03-02T12:29:31.356514'
    }]
  }

我尝试了一个聚合查询,但它只给了我计数。 另外,我想在回复中包含最新记录。

  1. 如何从 Elasticsearch 中获取按 id 分组的排序的唯一记录?
  2. 我想先插入最新的数据

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation elasticsearch-dsl


    【解决方案1】:

    假设一个覆盖datej_id 字段的最小映射:

    PUT myindex
    {
      "mappings": {
        "properties": {
          "j_id": {
            "type": "keyword"
          },
          "date": {
            "type": "date"
          }
        }
      }
    }
    

    您可以利用terms aggregation,其sub-aggregation 是有序的top_hits aggregation

    POST myindex/_search?filter_path=aggregations.*.buckets.key,aggregations.*.buckets.sorted_hits.hits.hits._source
    {
      "size": 0,
      "aggs": {
        "by_j_id": {
          "terms": {
            "field": "j_id",
            "size": 10,
            "order": {
              "max_date": "desc"
            }
          },
          "aggs": {
            "max_date": {
              "max": {
                "field": "date"
              }
            },
            "sorted_hits": {
              "top_hits": {
                "size": 10,
                "sort": [
                  {
                    "date": {
                      "order": "desc"
                    }
                  }
                ]
              }
            }
          }
        }
      }
    }
    

    URL 参数filter_path 减少了响应正文以紧密模仿您所需的格式:

    {
      "aggregations" : {
        "by_j_id" : {
          "buckets" : [
            {
              "key" : "1",        
              "sorted_hits" : {
                "hits" : {
                  "hits" : [
                    {
                      "_source" : {
                        "title" : "Hello from elastic",
                        "name" : "ABC",
                        "j_id" : "1",
                        "date" : "2021-03-02T12:29:31.356514"
                      }
                    },
                    {
                      "_source" : {
                        "title" : "Hello from elastic",
                        "name" : "PQR",
                        "j_id" : "1",
                        "date" : "2021-03-02T12:29:31.356514"
                      }
                    }
                  ]
                }
              }
            },
            {
              "key" : "2",
              "sorted_hits" : {
                "hits" : {
                  "hits" : [
                    {
                      "_source" : {
                        "title" : "Hello from elastic",
                        "name" : "XYZ",
                        "j_id" : "2",
                        "date" : "2021-03-02T12:29:31.356514"
                      }
                    }
                  ]
                }
              }
            },
            {
              "key" : "3",
              "sorted_hits" : {
                "hits" : {
                  "hits" : [
                    {
                      "_source" : {
                        "title" : "Hello from elastic",
                        "name" : "MNO",
                        "j_id" : "3",
                        "date" : "2021-03-02T12:29:31.356514"
                      }
                    }
                  ]
                }
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 你好乔,这个解决方案对我有用,但我想先插入最新的数据。
    • 好的,问题中没有提到 ;) 我已经更新了我的答案——诀窍是在 date 字段上添加一个 max 聚合,然后对 terms 进行排序它。希望对您有所帮助。
    • 我可以在上面的查询中添加分页吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2015-11-16
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多