TermQuery查询keyword类型字段无结果,移除后缀却正常?求助
问题原因及解决方法
原因分析
- 你的
creatorId字段本身已经是keyword类型,Elasticsearch中只有text类型字段会自动生成.keyword子字段(用于精确匹配场景)。对于原生keyword类型的字段,不存在.keyword这个子字段,所以查询creatorId.keyword本质是在查询一个不存在的字段,自然返回空结果。 - 直接查询
creatorId时,因为字段本身就是keyword类型,TermQuery会精确匹配存储的原始值,所以能得到预期结果。
解决方法
方法一:直接使用原字段查询(推荐)
去掉查询语句中的.keyword后缀,直接用字段名creatorId进行TermQuery即可,这是最合理的方式,原字段已经完全满足精确匹配需求:
GET myindex/_search { "query": { "term": { "creatorId": "c29dae46-23bd-4349-b989-f6bb803b1dd8" } } }
方法二:显式添加.keyword子字段(冗余,不推荐)
如果因为业务逻辑需要统一使用.keyword后缀查询,可以在索引映射中显式为creatorId添加.keyword子字段,但这属于冗余操作,因为原字段已经是keyword类型,功能完全重复:
"creatorId": { "type": "keyword", "fields": { "keyword": { "type": "keyword" } } }
修改映射后需要重新索引数据,之后就能用creatorId.keyword进行查询了。
内容的提问来源于stack exchange,提问作者wuggs
相关产品推荐
相关产品推荐

