首页 > 解决方案 > 我是如何达到 index.mapping.total_fields.limit 的?

问题描述

我正在将数据加载到 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 个字段。

标签: elasticsearchkotlinspring-data-elasticsearch

解决方案


这种行为源于您没有指定参数属性的存储方式。让我们假设,在一个实体中,paraneters 是从“foo”到某些数据的映射。这将导致创建以下映射(仅显示相关部分):

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

如果下一个实体parametersbar到某物,则为“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并且需要在代码中的某处进行检查。

就个人而言,我会在我的应用程序中有一个域层,我将在其中使用 aMap和一个持久层,在其中我使用存储数据所需的特定版本 - 这里使用List. 在将数据从域转换到持久层并返回时,我会进行这种转换。


推荐阅读