Elasticsearch —— Fielddata is disabled on text fields by default. Set fielddata=true on [xxxx]...

当在Elasticsearch中遇到`Fielddata is disabled on text fields by default.`错误时,原因是text字段默认不启用fielddata。为解决这个问题,需在Es模型中针对该字段设置`fielddata`: true。此错误通常发生在生产环境中新增字段而测试环境未同步更新导致的模型冲突。

问题

es搜索接口报错

Fielddata is disabled on text fields by default. Set fielddata=true on [xxxx] in order to load fie

解决

字段类型为text,默认fielddata在text字段上默认不起作用,导致报错。

需将es模型中的该字段增加如下设置

 "fielddata": true

原因分析 

其实并不是模型没有设计好。出现问题的字段是在生产上临时增加的字段,测试环境未添加此字段,导致es自动给该字段分配模型,出错。

### Elasticsearch 中启用 Fielddata 或使用 Keyword 字段的解决方案 在 Elasticsearch 中,`text` 类型字段默认禁用 `fielddata`,这是为了防止内存占用过高。当需要对 `text` 字段进行排序、聚合或脚本访问时,会遇到类似以下错误信息:`Fielddata is disabled on text fields by default. Set fielddata=true on [publishDate] in order to load fielddata in memory by uninverting the inverted index.`[^2] #### 解决方案 1:启用 Fielddata 如果确实需要对 `text` 字段启用 `fielddata`,可以通过修改字段映射来实现。以下是具体操作步骤: 1. **更新字段映射** 使用 `_mapping` API 更新索引中的字段定义,将 `fielddata` 设置为 `true`。 ```json PUT /bbs/_mapping { "properties": { "publishTime": { "type": "text", "fielddata": true } } } ``` 注意:启用 `fielddata` 可能导致内存占用显著增加,因此需要根据实际需求谨慎使用[^2]。 2. **监控 Fielddata 内存使用情况** 为了确保性能稳定,建议定期监控 `fielddata` 的内存使用情况。可以使用以下命令查看相关统计信息: - 查看索引级别的 `fielddata`: ```bash GET /_cat/fielddata?v ``` - 查看主机级别的 `fielddata`: ```bash GET /_stats/fielddata?level=indices ``` - 查看字段级别的 `fielddata`: ```bash GET /_nodes/stats/indices/fielddata?fields=* ``` 这些命令可以帮助识别哪些字段占用了较多内存[^3]。 #### 解决方案 2:使用 Keyword 字段替代 更推荐的方式是使用 `keyword` 类型字段替代 `text` 字段进行排序和聚合操作。Elasticsearch 支持通过 `multi-fields` 定义同时包含 `text` 和 `keyword` 类型的字段。 1. **定义多字段映射** 在创建索引时,定义一个包含 `text` 和 `keyword` 子字段的字段结构: ```json PUT /bbs { "mappings": { "properties": { "publishTime": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } } } ``` 2. **使用 Keyword 字段进行排序或聚合** 在查询中,使用 `publishTime.keyword` 字段进行排序或聚合操作: ```json POST /bbs/_search { "sort": [ { "publishTime.keyword": { "order": "asc" } } ] } ``` 这种方式避免了启用 `fielddata` 带来的内存问题,同时提供了高效的排序和聚合能力[^1]。 ### 总结 - 如果必须对 `text` 字段启用 `fielddata`,可以通过更新字段映射实现,但需注意内存开销。 - 更优的解决方案是使用 `keyword` 类型字段替代 `text` 字段进行排序和聚合操作,通过 `multi-fields` 实现两者的兼容性。 ```python # 示例代码:Python 脚本更新字段映射 from elasticsearch import Elasticsearch es = Elasticsearch() # 更新字段映射 es.indices.put_mapping( index="bbs", body={ "properties": { "publishTime": { "type": "text", "fielddata": True } } } ) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇宙超级无敌程序媛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值