Elasticsearch 6.x设置norms:false不生效问题求助
Elasticsearch 6.x中
norms: false不生效的排查与解决 我来帮你梳理这个问题,在ES 6.x里设置norms: false不生效通常有几个常见诱因,咱们一步步排查解决:
第一步:先确认映射是否真的被正确应用
你先执行这条命令检查当前索引的映射,确认title字段的norms配置是否真的生效了:
curl -X GET "localhost:9200/log_20180419/_mapping/_doc"
如果返回结果里title字段的norms还是true,那说明你的映射设置没被正确应用,接下来看下面的针对性解决方法。
可能的原因及解决办法
1. 先建索引再设映射的顺序问题
ES 6.x中,先创建空索引再单独设置映射,有时会被默认的动态映射规则干扰,导致自定义配置不生效。建议你删除旧索引后,创建索引时直接嵌入映射配置,这样能确保设置被精准应用:
curl -X PUT "localhost:9200/log_20180419" -H 'Content-Type: application/json' -d' { "mappings": { "_doc": { "properties": { "title": { "type": "text", "norms": false } } } } }'
执行完这条命令后,再用之前的GET映射命令确认norms已经是false,之后再插入数据。
2. 索引模板覆盖了你的映射设置
如果集群里存在匹配log_*的索引模板,模板里要是定义了title字段的norms: true,会优先覆盖你手动设置的映射。你可以查看所有索引模板:
curl -X GET "localhost:9200/_template"
找到名称包含log或匹配log_20180419的模板,检查其中title字段的配置。如果确实有冲突,你可以修改模板的norms设置,或者删除该模板(如果不需要的话)。
3. 修正Python代码的拼写错误
顺便提一句,你的Python代码里导入客户端时拼写错了,正确写法是:
from elasticsearch import Elasticsearch es_conn = Elasticsearch()
这个拼写错误可能导致数据插入失败,虽然和norms不生效没有直接关联,但也得修正避免其他问题。
验证解决效果
完成上述操作后,重新插入数据,然后可以用_explain API验证norms是否生效:
curl -X POST "localhost:9200/log_20180419/_doc/_explain" -H 'Content-Type: application/json' -d' { "query": { "match": { "title": "acxzcasiuchxzuicbhasuicgzyugas1" } } }'
返回结果里如果没有出现norm相关的评分计算逻辑,就说明norms: false已经生效了。
内容的提问来源于stack exchange,提问作者Wu Wrestle
相关产品推荐
相关产品推荐

