我是如何达到 index.mapping.total_fields.limit 的?

How I reached index.mapping.total_fields.limit?

我正在将数据加载到 Elasticsearch 并且我有 index.mapping.total_fields.limit。我完全不明白为什么会出现此错误,我正在加载到 ES 的 class 看起来像:

@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 种产品,之后出现此错误。你能给我解释一下,为什么我得到这个?我以为我的产品中只有 5 个字段 class。

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

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

如果下一个实体有 parametersbar 到某物,则会为“bar”创建一个新的映射条目。一旦地图中的键数超过限制,就会出现该错误。

编辑 2020 年 8 月 3 日:

您可以创建 class Parameter:

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

并将Product中对应的属性改为class为

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

您失去了 Map 拥有的唯一键保证,并且需要在您的代码中的某处进行检查。

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