我正在解析日志文件,为简单起见,我们会说它们具有以下格式:
{"message": "hello world", "size": 100, "forward-to": 127.0.0.1}
我将这些行编入索引为 Elasticsearch 索引,我已经定义了自定义映射,message
,size
和{{ 1}}分别是forward-to
,text
和integer
类型。但是,一些日志行将如下所示:
ip
当 Elasticsearch 尝试索引这些文档时,这会导致解析错误。由于技术原因,我预先处理这些文档并将{"message": "hello world", "size": "-", "forward-to": ""}
和"-"
更改为""
非常重要。无论如何要定义我的映射应该将哪些值视为null
?是否有一个我可以编写的分析器可以在任何字段类型上工作,我可以将其添加到映射中的所有条目中?
基本上我正在寻找与null
选项相反的方式。我没有告诉弹性搜索将null_value
变为什么,而是告诉它应该变成null_value
。同样可以接受的方法是告诉 Elasticsearch 简单地忽略看起来某种方式但仍解析文档中其他字段的字段。
答案 0 :(得分:0)
所以这显然很容易。将以下内容添加到映射设置中:
{
"settings": {
"index": {
"mapping": {
"ignore_malformed": "true"
}
}
}
}
这仍将为该字段编制索引(与我从文档中理解的内容相反......)但在聚合期间将被忽略(因此,如果integer
字段中有3个条目{{{ 1}},"1"
和3
,平均聚合将产生"hello world"
)。
请记住,由于选项的实现方式(我会说这是一个错误),这仍然失败,并且2
作为具体值输入,反之亦然。如果您想绕过它,可以将字段的object
值设置为enabled
,如下所示:
false
这是有代价的,因为这意味着该字段不会被编入索引,但输入的值仍将被存储,因此您仍然可以通过另一个字段搜索该文档来访问它们。这通常不应该是一个问题,因为您可能不会根据这种不可预测字段的值过滤文档,但这取决于您的具体案例使用情况。有关此问题的官方讨论,请参阅here。