Logstash中Elasticsearch模板映射异常,无法通过REST Client排序字段
解决Elasticsearch排序时的"Text fields are not optimised..."错误
看起来你遇到的问题是虽然在模板里把int_var设为了keyword类型,但实际查询时还是触发了文本字段不支持排序的错误。这通常有几种可能的原因,下面给你对应的解决办法:
1. 先确认字段的实际类型是否符合预期
首先你需要排查现有索引中int_var的真实类型,因为模板可能没正确应用到已创建的索引上。执行以下命令查看索引的映射:
GET index_name/_mapping
如果返回的结果里int_var是text类型,说明你的模板没生效:
- 如果是已存在的索引:你需要删除现有索引(注意提前备份数据),然后重新创建,确保模板在创建索引前就已经被Elasticsearch加载。
- 如果是新索引:检查Logstash的配置,确保已经开启了模板自动加载(默认是开启的,但如果自定义了模板路径可能需要调整)。
2. 修正字段类型(推荐方案)
既然你的字段名叫int_var,看起来是整数类型,直接用integer类型会比keyword更适合排序,而且查询效率更高。修改你的Logstash模板如下:
{ "index_patterns": ["index_name"], "template": { "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "_doc": { "properties": { "int_var": { "type": "integer" } } } } } }
更新模板后,重新创建索引,之后再执行排序查询就不会有问题了。
如果确实需要用字符串类型存储(比如带前导零的数字),那保持keyword类型即可,但要确保模板正确应用,字段实际是keyword类型。
3. 临时方案:开启fielddata(不推荐)
如果不能修改索引结构或重新创建索引,可以临时开启fielddata来允许text字段排序,但这会占用较多堆内存,不建议在大型索引上使用。执行以下命令修改映射:
PUT index_name/_mapping/_doc { "properties": { "int_var": { "type": "text", "fielddata": true, "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }
之后你可以使用int_var.keyword来排序(推荐用这个keyword子字段,比开启fielddata更高效),或者直接用int_var(依赖fielddata)。
内容的提问来源于stack exchange,提问作者Orkun
相关产品推荐
相关产品推荐

