Elasticsearch无法按text字段排序,已存在keyword子字段仍报错?
问题:Elasticsearch按text字段排序报错,已配置keyword子字段仍无法解决?
我尝试执行以下排序查询:
GET /books/_search { "sort": [ {"name": "asc"} ] }
但收到如下错误提示:
[books]索引中的[name]字段已禁用fielddata。text字段未针对聚合、排序等需要逐文档字段数据的操作优化,因此默认禁用此类操作,请改用keyword字段。
查询索引映射后发现,name字段已配置了keyword子字段:
执行命令:GET /books/_mapping/
返回结果:
{ "books": { "mappings": { "properties": { ... "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, ... } } } }
请问我哪里操作出错了?
解答
你出错的核心原因是排序时没指定使用keyword子字段,直接用了text类型的主字段name。
正确的排序查询应该修改为:
GET /books/_search { "sort": [ {"name.keyword": "asc"} ] }
当你给text字段配置keyword子字段后,Elasticsearch会存储两份数据:
- 主字段
name是text类型,会被分词,适合全文检索; - 子字段
name.keyword是keyword类型,保留原始未分词内容,专门用于排序、聚合这类操作。
你之前的查询还是指向了text主字段,自然触发fielddata禁用的错误,只要在字段名后加上.keyword指定子字段,就能正常排序了。
内容的提问来源于stack exchange,提问作者eltomek
相关产品推荐
相关产品推荐

