Как написать отдельный запрос в Elasticsearch 7.6.2 - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в ES. Мое требование состоит в том, чтобы получить последние n последних отметок времени и различные trace_id вместе с их записями. Как и в запросе sql «Выберите отличный trace_id, job_name из stpjoblogs, где status =« SUCCESS »». Пожалуйста, дайте мне знать, как добиться того же в Elasticsearch 7.6.2.

Мой ответ будет:

_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"
        }

, и я попытался выполнить следующий запрос:

GET /stpjoblogs/_search
{
  "query": {
    "bool": {
       "must": [
         {"match":{"status":"SUCCESS"}}
         ]
    }
  },
  "sort": [
    {
      "timestamp": {
        "order": "desc"
      }
    }
  ],
  "aggs": {
    "distinct_transactions": {
      "terms": { "field": "trace_id"}
    }
  }
}

Но я получаю ошибку ниже

{
  "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
}

1 Ответ

0 голосов
/ 29 апреля 2020

Вам необходимо добавить trace_id.keyword. Если индекс создан путем автоматического сопоставления, это поле уже будет присутствовать или вам нужно это отобразить в

"trace_id":{
   "type":"text",
   "fields":{
      "keyword":{
           "type":"keyword"
       }
    }
}
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"}]
              }
            }
          }
        }
      }
    }
  }
}

Чтобы получить последний документ для trace_id, вы можете использовать сворачивание поля работает как Группировка по и возвращает один верхний документ на поле

{
  "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"
      }
    }
  ]
}
...