我面临着Elasticsearch的一个奇怪问题。我的映射指定某个字段的类型为long
。现在我不小心试图为那些字段string
类型的文档编制索引而不是long
。我没有收到Elasticsearch的错误,但文档从未编入索引。当我修复问题时,文档被编入索引就好了。
示例:
我的映射:
{
"field1": {
"type": "long"
}
}
当我发送此文档时,它会无声地失败:
{
"field1": "this is a string"
}
当我发送它时,它按预期工作:
{
"field1": 12345
}
有没有办法检测出这种错误?
答案 0 :(得分:5)
我怀疑你的映射看起来与此相似:
{
"long_field": {
"type": "long"
}
}
如果是这种情况,您可以将coerce
标记设置为false
,因为它是true
by default并始终尝试将字符串转换为数字并截断整数的分数
{
"long_field": {
"type": "long",
"coerce": false
}
}
如果你这样做,下次你尝试将长字段索引为字符串时,ES会告诉你:
MapperParsingException[failed to parse [long_field]]; nested: IllegalArgumentException[Long value passed as String];
答案 1 :(得分:4)
如果将ignore_malformed字符串设置为false。如果文档格式错误但是抛出异常,它不会索引文档。至少在elasticsearch 1.6.0中。
示例:
put test
put test/test/_mapping
{
"properties" : {
"title" : {"type" : "string"},
"data" : {"type": "long" ,"ignore_malformed":false}
}
}
put test/test/1
{
"data" : "1",
"title" : "valid coerce string to number"
}
put test/test/2
{
"data" : "hello",
"title" : "invalid number"
}
#Failed Response
{
"error": "MapperParsingException[failed to parse [data]]; nested: NumberFormatException[For input string: \"hello\"]; ",
"status": 400
}
Query with Get fails
get test/test/2
{
"_index": "test",
"_type": "test",
"_id": "2",
"found": false
}