У меня есть следующее отображение индекса: поле с именем customFields содержит другие поля, такие как firstName, lastName и т. д.
{
"customFields": {
"properties": {
"firstName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"lastName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"address": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"dateOfBirth": {
"type": "date"
},
}
}
}
В моем проекте Spring customFields — это Map<String, Object>.
Поле dateOfBirth принимает значения в формате YYYY-MM-DD и является String.
Однако при сохранении в ElasticSearch тип становится date. Я занимался отладкой и нигде не нашел в приложении, где тип dateOfBirth меняется на дату перед отправкой в ElasticSearch.
Возможно ли, что ElasticSearch сам меняет тип в фоновом режиме?
Вы не определяете сопоставление Elasticsearch явно для этих полей, и когда Elasticsearch видит их, он пытается сопоставить их с лучшими типами данных, поскольку ваш dateOfBirth имеет YYYY-MM-DD, даже если он заключен в «», и вы хотите, чтобы они были полем text , Elasticsearch сопоставляет его с полем date из-за его значения.
если вы хотите избежать этого, вам нужно явно определить dateOfBirth с типом данных text в сопоставлении индекса Elasticsearch.
Надеюсь это поможет.
@murohima_1, вы не можете изменить тип данных существующего поля, но вы можете добавить новое поле, используя API сопоставления обновлений elastic.co/guide/en/elasticsearch/reference/current/…, таким образом новые данные будут иметь правильное сопоставление или, если у вас меньше данных, просто создайте свежий индекс
Как вы сказали, ElasticSearch выполняет автоматическое сопоставление на основе значения поля. Я нашел способ отключить date_detection здесь elastic.co/guide/en/elasticsearch/reference/current/… Однако, когда я запускаю запрос PUT, чтобы отключить date_detection, он возвращает ошибку о том, что индекс уже существует
@murohima_1 да, как будто вы не можете изменить тип данных, похоже, вы не можете изменить этот параметр после создания индекса .. я бы посоветовал вам начать с нуля
@murohima_1 дайте мне знать, если у вас есть дополнительные вопросы, в противном случае, пожалуйста, проголосуйте и отметьте ответ
Проголосовал, но мне нужно еще немного репутации, чтобы он появился. Отметил ответ как правильный. Спасибо
Эй, я разместил еще один вопрос, который отчасти связан с этим. Не могли бы вы проверить это? stackoverflow.com/questions/72220153/…
Давайте продолжить обсуждение в чате.
В порядке. Это имеет смысл. Если сопоставление индекса уже создано и
dateOfBirthсопоставлено сdate, есть ли способ обновить сопоставление индекса через консоль?