Elasticsearch 7.4中能否查询未映射字段?范围查询结果不符问题
Elasticsearch 范围查询返回所有文档的问题分析与解决
问题原因
索引设置了dynamic: false,且未提前在mapping中定义published_at字段。插入文档时,ES不会自动为未定义的字段创建可用于查询的倒排索引(仅在_source中保留字段内容)。此时执行published_at的range查询时,ES无法找到该字段的索引数据,会将该查询条件判定为匹配所有文档,最终返回全部4条数据。
解决方法
方法1:重新创建索引并定义正确的mapping
删除原有索引,创建包含published_at(date类型)的新索引,再重新插入文档:
# 删除原索引 DELETE test_date_mapping_with_null # 创建新索引并配置mapping PUT test_date_mapping_with_null { "mappings": { "dynamic": false, "properties": { "city": { "type": "text" }, "published_at": { "type": "date" } } } } # 重新插入文档示例 POST test_date_mapping_with_null/_doc/1 { "city": "Beijing", "published_at": "2022-01-01" } # 依次插入其他文档...
方法2:更新现有索引的mapping并重新索引文档
无需删除索引,手动添加published_at字段的mapping,再触发重新索引让ES为已有文档的该字段生成索引:
# 更新mapping,添加published_at字段 PUT test_date_mapping_with_null/_mapping { "properties": { "published_at": { "type": "date" } } } # 重新索引现有文档,使published_at字段被正确索引 POST test_date_mapping_with_null/_update_by_query
完成上述操作后,再执行published_at的range查询,即可正确返回符合时间范围的文档。
内容的提问来源于stack exchange,提问作者Abhishek Jadav
相关产品推荐
相关产品推荐

