включил данные поля в текстовое поле в ElasticSearch, но агрегация не работает - PullRequest
0 голосов
/ 27 июня 2019

В соответствии с документацией вы можете запускать агрегаты ElasticSearch для полей типа ключевое слово или не являющихся текстовым полем или для которых fielddata имеет значение true в отображении индекса.

Я пытаюсь сосчитать названия_городей в журнале nginx.Он отлично работает с полем int result .Но оно не работает с полем city_name, даже когда я обновил сопоставление индекса, добавив в него fielddata = true .Значение должно быть не обязательным, поскольку оно имеет тип ключевое слово .

Сказать, что это не работает, означает, что:

"aggregations" : {
    "cities" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ ]
    }
  }

Вот отображение поля:

"city_name" : {
          "type" : "text",
          "fielddata" : true
        },

А вот запрос агрессии:

curl -XGET --user $pwd --header 'Content-Type: application/json'  https://58571402f5464923883e7be42a037917.eu-central-1.aws.cloud.es.io:9243/logstash/_search?pretty -d '{
      "aggs" : {
        "cities": {
           "terms" : { "field": "city_name"}
        }
    }
}'

1 Ответ

1 голос
/ 27 июня 2019

Если вы не получаете никакой ошибки при выполнении поиска, похоже, это больше похоже на проблему с данными.Вы уверены, что у вас есть хотя бы один документ с заполненным полем city_name ?

Я попытался воспроизвести вашу проблему с ElasticSearch 6.6.2.

  • Я создал индекс

    PUT cities
    {
      "mappings": {
        "city": {
          "dynamic": "true",
          "properties": {
            "id": {
              "type": "long"
            },
            "city_name": {
              "type": "text",
              "fielddata": true
            }
          }
        }
      }
    }
    
  • Я добавил один документ без названия города

    PUT cities/city/1
    {
      "id": "1"
    }
    

Когда я выполнил поиск:

GET cities/_search
{
  "aggs": {
    "cities": {
       "terms" : { "field": "city_name"}
    }
  }
}

Я не получил ни одного сегмента в агрегации городов .Но когда я добавил один документ с названием города:

PUT cities/city/2
{
  "id": "2",
  "city_name": "London"
}

, я получил ожидаемый результат:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "cities",
        "_type" : "city",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "id" : "2",
          "city_name" : "london"
        }
      },
      {
        "_index" : "cities",
        "_type" : "city",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "id" : "1"
        }
      }
    ]
  },
  "aggregations" : {
    "cities" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "london",
          "doc_count" : 1
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...