elasticsearch - 我是如何达到 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 个字段。
解决方案
这种行为源于您没有指定参数属性的存储方式。让我们假设,在一个实体中,paraneters 是从“foo”到某些数据的映射。这将导致创建以下映射(仅显示相关部分):
{
"article": {
"mappings": {
"properties": {
"parameters": {
"properties": {
"foo": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
}
如果下一个实体parameters
从bar到某物,则为“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
. 在将数据从域转换到持久层并返回时,我会进行这种转换。
推荐阅读
- c# - 有没有办法在代码中指定引用?
- javascript - 需要帮助限制数组/优化 axios 响应
- java - pcap4j - Android Proguard/R8 配置
- php - PHP/FPDF 一直在 cloudflare 后面加载
- android - FutureBuilder 不返回小部件
- function - 在不调用函数的情况下,如何判断一个类型的基函数是否已在 Go 中被覆盖?
- c++ - 如何在 ssh/server 中搜索和使用文件
- r - 如何卸载带有所有包、设置和其他所有内容的 R 和 RStudio?
- sql-server - 如何将 SQL Server 中的数据库转换为 Azure SQL 中基于架构的对象
- html - 什么 CSS 属性将下拉菜单保留在其父 li 下?