Elasticsearch中keyword类型working_time字段term查询0命中问题咨询
问题根因
- 核心错误是字段映射类型和查询逻辑不匹配:你的
working_time字段配置的是keyword类型,该类型不会执行任何分词处理,会将整个字段值作为单个完整的token存储,和你测试时拿到的分词结果没有任何关系。 - 你调用
_analyze接口时未指定field参数,默认使用了标准分词器处理文本,所以拆分出了12的token,如果你指定"field": "working_time"参数执行分析,会得到仅包含完整JSON串的单个token,不存在12的拆分结果。 term查询为精确匹配逻辑,只会返回存储的token和查询值完全相等的文档,你当前working_time字段存储的唯一token就是整个长JSON串,和查询值12完全不匹配,因此查询无结果。
可选解决方案
方案1:调整字段映射为text类型
如果你需要对字段内容做分词模糊匹配,修改索引mapping后重新写入数据即可,原有查询可正常命中:
PUT /freelancer_working_days { "mappings":{ "properties":{ "id": {"type": "text"}, "freelancer_id": {"type": "text"}, "working_days": {"type": "text"}, "working_time": {"type":"text"} } } }
方案2:优化为结构化存储(推荐)
将原本结构化的时间数据改为嵌套对象存储,避免后续查询逻辑混乱,同时查询效率更高:
// 新索引mapping PUT /freelancer_working_days { "mappings":{ "properties":{ "id": {"type": "keyword"}, "freelancer_id": {"type": "keyword"}, "working_days": {"type": "integer"}, "working_time": { "type": "nested", "properties": { "day_of_week": {"type": "integer"}, "to": {"type": "integer"}, "from": {"type": "integer"} } } } } }
内容的提问来源于stack exchange,提问作者Tushar Roy
相关产品推荐
相关产品推荐

