在Elasticsearch中,“Limit of total fields [1000] in index [] has been exceeded”是什么意思

8nuwlpux  于 2023-03-29  发布在  ElasticSearch
关注(0)|答案(4)|浏览(406)

我创建了ElasticSearch索引,其中有大约350个字段(包括嵌套字段),我只为其中一些定义了Map。在调用_update API时,我得到了下面的400 Bad request异常。
已超过索引[test_index]中字段总数[1000]的限制
我想了解这个异常的确切原因,因为我的字段数和定义Map的字段数都小于1000。

**注意:**我已经启用了嵌套字段和动态Map。

hrysbysz

hrysbysz1#

您可以通过增加www.example.com _fields.limit的值来修复此问题index.mapping.total(默认值为1000)

index.mapping.total_字段限制
索引中的最大字段数。字段和对象Map以及字段别名都计入此限制。默认值为1000。
要将字段总数限制增加到2000,请尝试以下操作

PUT test_index/_settings
{
  "index.mapping.total_fields.limit": 2000
}

限制字段数量的原因是:
在索引中定义太多字段会导致Map爆炸,从而导致内存不足错误和难以恢复的情况。这在动态Map中非常常见。每次文档包含新字段时,这些字段都会出现在索引的Map中
相关资源:

  1. Get the number of fields on an index
    2.防止Map爆炸的设置
lb3vh1jj

lb3vh1jj2#

我通过谷歌登陆了这里。这对我很有效(从shell):

curl -s -XPUT http://localhost:9200/test-index/_settings  -H 'Content-Type: application/json' -d '{"index.mapping.total_fields.limit": 2000}'
fcg9iug3

fcg9iug33#

另一种处理此问题的方法是像OP所做的那样仔细设计Map,并通过设置dynamic = false(甚至dynamic = strict)关闭动态Map。
请注意,这种方法可以应用于整个Map或其他属性/嵌套对象,这可以实现相当好的灵活性。
参考文档中的Dynamic mapping

pnwntuvh

pnwntuvh4#

另一种可能的解决方案,特别是在Groovy上下文中工作时:检查你的数据是否是一个(格式良好的)String示例。在我的例子中,我一直在Groovy中使用myMappedData as JSON将Map的数据转换为JSON。解决方案是使用(myMappedData as JSON).toString()。参见https://stackoverflow.com/a/71938642/4420271

相关问题