问题描述
我索引中的字段映射为:
"sequence_number" : {
"type" : "long","copy_to" : [
"_custom_all"
]
}
POST /my_index/_search
{
"query": {
"term": {
"sequence_number": {
"value": "we"
}
}
}
}
我收到错误消息:
,"index_uuid":"FTAW8qoYTPeTj-cbC5iTRw","index":"my_index","caused_by":{"type":"number_format_exception","reason":"For input string: \"we\""}}}]},"status":400}
at org.elasticsearch.client.RestClient.convertResponse(RestClient.java:260) ~[elasticsearch-rest-client-7.1.1.jar:7.1.1]
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:238) ~[elasticsearch-rest-client-7.1.1.jar:7.1.1]
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:212) ~[elasticsearch-rest-client-7.1.1.jar:7.1.1]
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1433) ~[elasticsearch-rest-high-level-client-7.1.1.jar:7.1.1]
at
我该如何忽略number_format_exception错误,因此查询只是不返回任何内容或特别忽略此过滤器-可以接受。
谢谢。
解决方法
要查找的内容是不可能的,理想情况下,应该在数字字段上启用coherce,以使索引中不包含脏数据。
最好的解决方案是在生成Elasticsearch查询的应用程序中(如果要搜索数字字段,则应检查NumberFormatExcepton
,因为索引首先不包含脏数据,并且如果您在应用程序中遇到异常,则拒绝查询。
编辑:另一个有趣的方法是,在插入ES之前先验证数据,使用@prakash建议的Validate API,唯一的是它将添加另一个网络呼叫,但是如果您的应用程序对延迟不敏感,可以将其用作解决方法。