Как я достиг index.mapping.total_fields.limit? - PullRequest
0 голосов
/ 02 августа 2020

Я загружаю данные в Elasticsearch, и у меня есть index.mapping.total_fields.limit. Я совершенно не понимаю, почему у меня эта ошибка, мой класс, который я загружаю в ES, выглядит так:

@Document(type = "article", indexName = "data")
data class Product(
        @Id
        val id: String? = null,
        val category: String,
        val name: String,
        val imagesUrls: List<String>,
        val parameters: Map<String, List<String>>?
)

Я добавил уже около 3k продуктов, после этого я получил эту ошибку. Вы можете мне объяснить, почему я получил это? Я думал, что в моем классе Product всего 5 полей.

1 Ответ

2 голосов
/ 02 августа 2020

Такое поведение происходит из-за того, что вы не указываете, как должно храниться свойство parameters . Предположим, что в одном объекте paraneters - это карта от "foo" к некоторым данным. Это приводит к созданию следующих сопоставлений (показывающих только соответствующую часть):

{
  "article": {
    "mappings": {
      "properties": {
        "parameters": {
          "properties": {
            "foo": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        }
      }
    }
  }
}

Если у следующего объекта было parameters от bar к чему-то, новая запись сопоставления для «бар» создан. И как только количество ключей на вашей карте превысит лимит, вы получите эту ошибку.

Изменить 03.08.2020:

Вы можете создать класс Parameter:

data class Parameter(
    val key: String,
    val values: List<String>
)

и измените соответствующее свойство в классе Product на

@Field(type = FieldType.Nested)
val parameters: List<Parameter>

Вы теряете гарантию уникального ключа, которую имеет Map, и вам нужно будет где-то это проверить в вашем коде.

Лично я бы имел в своем приложении уровень домена, где я бы использовал Map, и уровень сохранения, где я использую версию c, необходимую для хранения данных - здесь с а List. И при преобразовании данных из домена в уровень сохраняемости и обратно я бы сделал это преобразование.

...