弹性搜索按选定字段排序聚合

时间:2016-02-22 15:47:14

标签: elasticsearch

如何通过源数据中的字段对聚合的输出进行排序,但不是聚合输出的一部分?

在我的源数据中,我有一个日期字段,我希望聚合的输出按日期排序。

这可能吗?我已经看过在聚合中使用“order”,但我不认为它可以看到使用它进行排序的日期字段?

我还尝试添加一个包含日期字段的子聚合,但同样,我无法对此字段进行排序。

我正在计算我的ETL中每个文档的哈希值。我的数据集包含很多重复,所以我试图在哈希字段上使用聚合来过滤掉重复项,并且工作正常。我需要聚合的输出以保留日期排序顺序,以便我可以使用angular。

处理输出

文件是这样的:

{_id: 123,
_source: {
"hash": "01010101010101"
"user": "1"
"dateTime" : "2001/2/20 09:12:21"
"action": "Login"
}

{_id: 124,
_source: {
"hash": "01010101010101"
"user": "1"
"dateTime" : "2001/2/20 09:12:21"
"action": "Login"
}


{_id: 132,
_source: {
"hash": "0202020202020"
"user": "1"
"dateTime" : "2001/2/20 09:20:43"
"action": "Logout"
}

{_id: 200,
_source: {
"hash": "0303030303030303"
"user": "2"
"dateTime" : "2001/2/22 09:32:14"
"action": "Login"
}

所以我想在哈希值上使用聚合来从我的集合中删除重复项,然后按日期顺序呈现响应。

我的查询:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "action": "Login"
              }
            }
          ]
        },
        "size": 0,
        "aggs": {
          "md5": {
            "terms": {
              "field": "hash",
              "size": 0
            }
          },
          "size": 0,
          "aggs": {
            "byDate": {
              "terms": {
                "field": "dateTime",
                "size": 0
              }
            }
          }
        }
      }
    }
  }
}

目前输出是在哈希上排序的,我需要在每个哈希桶的日期字段中对它进行排序。这可能吗?

1 个答案:

答案 0 :(得分:3)

如果“hash”上的聚合仅用于删除重复项,则可能只需先在“dateTime”上聚合,然后在“hash”上聚合terms聚合。例如:

GET my_index/test/_search
{
  "query" : {
    "filtered" : {
      "filter" : {
        "bool": {
          "must" : [
            { "term": {"action":"Login"} }
          ]
        }
      }
    }
  },
  "size": 0,
  "aggs": {
    "byDate" : {
      "terms": {
        "field" : "dateTime",
        "order": { "_term": "asc" }   <---- EDIT: must specify order here
      },
      "aggs": {
        "byHash": {
          "terms": {
            "field": "hash"
          }
        }
      }
    }
  }
}

这样,您的结果将首先按“dateTime”排序。