ElasticSearch автоматически преобразует тип поля внутри карты Java из строки в дату при сохранении

У меня есть следующее отображение индекса: поле с именем 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 сам меняет тип в фоновом режиме?

1
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не определяете сопоставление Elasticsearch явно для этих полей, и когда Elasticsearch видит их, он пытается сопоставить их с лучшими типами данных, поскольку ваш dateOfBirth имеет YYYY-MM-DD, даже если он заключен в «», и вы хотите, чтобы они были полем text , Elasticsearch сопоставляет его с полем date из-за его значения.

если вы хотите избежать этого, вам нужно явно определить dateOfBirth с типом данных text в сопоставлении индекса Elasticsearch.

Надеюсь это поможет.

В порядке. Это имеет смысл. Если сопоставление индекса уже создано и dateOfBirth сопоставлено с date, есть ли способ обновить сопоставление индекса через консоль?

murohima_1 12.05.2022 12:59

@murohima_1, вы не можете изменить тип данных существующего поля, но вы можете добавить новое поле, используя API сопоставления обновлений elastic.co/guide/en/elasticsearch/reference/current/…, таким образом новые данные будут иметь правильное сопоставление или, если у вас меньше данных, просто создайте свежий индекс

Amit 12.05.2022 13:09

Как вы сказали, ElasticSearch выполняет автоматическое сопоставление на основе значения поля. Я нашел способ отключить date_detection здесь elastic.co/guide/en/elasticsearch/reference/current/… Однако, когда я запускаю запрос PUT, чтобы отключить date_detection, он возвращает ошибку о том, что индекс уже существует

murohima_1 12.05.2022 13:43

@murohima_1 да, как будто вы не можете изменить тип данных, похоже, вы не можете изменить этот параметр после создания индекса .. я бы посоветовал вам начать с нуля

Amit 12.05.2022 13:51

@murohima_1 дайте мне знать, если у вас есть дополнительные вопросы, в противном случае, пожалуйста, проголосуйте и отметьте ответ

Amit 12.05.2022 17:51

Проголосовал, но мне нужно еще немного репутации, чтобы он появился. Отметил ответ как правильный. Спасибо

murohima_1 12.05.2022 19:07

Эй, я разместил еще один вопрос, который отчасти связан с этим. Не могли бы вы проверить это? stackoverflow.com/questions/72220153/…

murohima_1 12.05.2022 19:57

Давайте продолжить обсуждение в чате.

Amit 13.05.2022 05:00

Другие вопросы по теме