Как исправить ElasticSearch «Данные поля отключены в текстовых полях по умолчанию» для поля ключевого слова

Я получаю сообщение «Fielddata по умолчанию отключено для текстовых полей» в поле ключевого слова. Ниже приведен код.

{
 "aggs": {
   "agg_terms_user": {
     "terms": {
       "field": "user"
     }
   }
 }
}

Сопоставление поля пользователя показано ниже.

user: { type: "keyword" }

Поскольку тип поля пользователя задан как ключевое слово, я не должен получать сообщение об ошибке. Однако ошибка все равно выдается.

[незаконный_аргумент_exception] Данные поля по умолчанию отключены для текстовых полей. Установите fielddata = true для [пользователя], чтобы загрузить данные поля в память путем отмены инвертирования инвертированного индекса. Обратите внимание, что при этом может потребоваться значительный объем памяти. В качестве альтернативы используйте вместо этого поле ключевого слова.

Я не знаю, что сейчас попробовать.


person Nikhil    schedule 12.12.2019    source источник
comment
используйте это в терминах агрегирования "field": "user.keyword"   -  person Andrey Borisko    schedule 12.12.2019
comment
Это не сработает. Поле пользователя уже задано как ключевое слово. Если бы я сопоставил его как user: {type: text, fields: {keyword: {type: keyword}, ​​тогда имело бы смысл использовать user.keyword   -  person Nikhil    schedule 12.12.2019
comment
ой, извините .. неправильно понял. какая это версия ES?   -  person Andrey Borisko    schedule 12.12.2019
comment
Это версия 6.3   -  person Nikhil    schedule 12.12.2019
comment
Убедитесь, что user (или используемое вами поле) относится к типу keyword, потому что именно эта ошибка возникает при выполнении агрегации терминов в поле text.   -  person moliware    schedule 12.12.2019
comment
Я уже упоминал в вопросе, что это ключевое слово.   -  person Nikhil    schedule 12.12.2019
comment
Поделитесь своими картами   -  person Assael Azran    schedule 12.12.2019
comment
Я добавил отображение для пользователя выше   -  person Nikhil    schedule 12.12.2019
comment
Кроме того, у меня есть сомнения. Как выполнить агрегацию диапазона по длинному полю, если его ключевое слово является обязательным   -  person Nikhil    schedule 12.12.2019
comment
Это временная проблема. Иногда это работает, а иногда нет. Кроме того, он отлично работает без ошибок в одном экземпляре, в то время как он выдает периодические ошибки в другом. Оба экземпляра находятся на AWS и имеют одинаковый код. Я проверил конфигурацию AWS ES и ничего подозрительного не обнаружил. Я что-нибудь упускаю   -  person Nikhil    schedule 12.12.2019
comment
НЕТ, ваше пользовательское поле является текстовым типом данных, записывается в стеке ошибок. По умолчанию полевые данные отключены для текстовых полей. Установите fielddata = true для [user], чтобы загрузить fielddata.   -  person Lupanoide    schedule 12.12.2019
comment
возможно, у вас есть подполе под названием user.keyword типа keyword   -  person Lupanoide    schedule 12.12.2019
comment
Вот что я говорю, это непредвиденная ошибка. Это ключевое слово в моем коде, а у меня нет подполя. Кроме того, он отлично работает в одном экземпляре приложения, а в другом выдает ошибку.   -  person Nikhil    schedule 12.12.2019
comment
Вы уверены, что у вас нет подполя? Не могли бы вы попробовать {aggs: {agg_terms_user: {terms: {field: user.keyword}}}}   -  person Lupanoide    schedule 12.12.2019
comment
Как вы составили карту? Не могли бы вы опубликовать вывод GET ‹your_index_name› / _mapping   -  person Lupanoide    schedule 12.12.2019


Ответы (3)


Комментарий @Andrey Borisko был правильным

я использовал

"field": "user.keyword" 

вместо того

"field": "user" 

основанный на примере Нихила, и у меня это сработало.

person Investigator    schedule 20.10.2020
comment
Если у вас нет доступа / разрешений для изменения сопоставлений индексов и / или для повторного индексирования, это правильный путь. - person Gino Mempin; 18.01.2021

Я нашел причину неожиданной ошибки. ES не переиндексировался должным образом. Как только я сначала удалил проиндексированное, а затем воссоздал его, он начал работать как шарм.

person Nikhil    schedule 12.12.2019
comment
Не могли бы вы подробнее рассказать, как вам это удалось? (v6.8) - person rtrigo; 12.06.2020
comment
Удалите индекс и создайте его заново. - person Nikhil; 20.07.2020
comment
Удаление индексов действительно помогло, и вы можете сделать это в своем серверном терминале, используя эту команду curl -X DELETE 'http://localhost:9200/your_index_name', и на всякий случай, если вы не знаете имя своего индекса, вы можете использовать curl -X GET 'http://localhost:9200/_search', и вы увидите свои имена индексов. Замените свое доменное имя и порт, если какие-либо изменения в настройках по умолчанию. - person Prashant; 06.08.2020

Ознакомьтесь с документацией в эластичном тексте, в которой четко упоминается, что мы не можем использовать текстовое поле для агрегирования, сортировки или написания скриптов.

https://www.elastic.co/guide/en/elasticsearch/reference/current/text.html#fielddata-mapping-param.

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

поле: user.keyword

person Jayabharathi Palanisamy    schedule 20.07.2021