首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Elasticsearch 7.6.2中编写distinct查询

如何在Elasticsearch 7.6.2中编写distinct查询
EN

Stack Overflow用户
提问于 2020-04-29 20:40:53
回答 1查看 373关注 0票数 0

我是ES的新手。我的要求是获取最近n个最近的时间戳和不同的trace_id以及它们的记录。就像sql查询"Select distinct trace_id,job_name from stpjoblogs where status="SUCCESS"“一样。请告诉我如何在Elasticsearch 7.6.2中实现同样的功能。

我的回答是:

代码语言:javascript
复制
_source" : {
          "port" : 57376,
          "job_name" : "stbl-executive-dashboard",
          "timestamp" : "2020-04-28T10:55:45.640267+00:00",
          "trace_id" : "180600fd27ef8108",
          "PCF_Space" : "Development",
          "PCF_Org" : "EPSOrg",
          "status" : "SUCCESS"
        }

我尝试了下面的查询:

代码语言:javascript
复制
GET /stpjoblogs/_search
{
  "query": {
    "bool": {
       "must": [
         {"match":{"status":"SUCCESS"}}
         ]
    }
  },
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "distinct_transactions": {
      "terms": { "field": "trace_id"}
    }
  }
}

但是我的错误不是很明显

代码语言:javascript
复制
{
  "error" : {
      "caused_by" : {
        "type" : "illegal_argument_exception",
        "reason" : "Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [trace_id] in order to load field data by uninverting the inverted index. Note that this can use significant memory."
      }
  },
  "status" : 400
}
EN

回答 1

Stack Overflow用户

发布于 2020-04-29 21:00:51

您需要添加trace_id.keyword。如果索引是通过自动映射创建的,则此字段将已经存在,或者您需要在映射中使用此字段

代码语言:javascript
复制
"trace_id":{
   "type":"text",
   "fields":{
      "keyword":{
           "type":"keyword"
       }
    }
}
代码语言:javascript
复制
GET /stpjoblogs/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "status": "SUCCESS"
          }
        }
      ]
    }
  },
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "distinct_transactions": {
      "terms": {
        "field": "trace_id.keyword"
      },
      "aggs": {
        "job_names": {
          "terms": {
            "field": "job_name.keyword",
            "size": 10
          },
          "aggs": {
            "docs": {
              "top_hits": {
                "size": 1,
                "sort": [{"timestamp":"desc"}]
              }
            }
          }
        }
      }
    }
  }
}

要获取分组的最新文档,您可以使用field collapsing,它的工作方式类似于trace_id by,并为每个字段返回前一个文档

代码语言:javascript
复制
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "status": "SUCCESS"
          }
        }
      ]
    }
  },
  "collapse": {
    "field": "trace_id.keyword",
    "inner_hits" : {
            "name": "space",
            "collapse" : {"field" : "job_name.keyword"},
            "size": 3
        }
  },
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61502048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档