动态模板:将对象存储为普通字符串

时间:2017-02-15 11:52:44

标签: elasticsearch

假设将以下文档插入Elasticsearch。

{
    "message": "hello",
    "request": {
        "body": {
            "data": "hi",
            "some_what_dynamic": {
                "nested": {
                    "not_ending": 10000
                }
            }
        }
    }
}

鉴于字段request.body是动态对象,其中包含嵌套对象和/或字段,我想将整个request.body存储为string而我不想要Elasticsearch为request.body对象内的属性创建新字段。

如何定义映射以实现此目的?

这是当前的dynamic_templates定义:

{
    "template": "logstash-*",
    "mappings": {
        "_default_": {
            "dynamic_templates": [
                {
                    "message_field": {
                        "path_match": "message",
                        "mapping": {
                            "norms": false,
                            "type": "text"
                        },
                        "match_mapping_type": "string"
                    }
                },
                {
                    "string_fields": {
                        "mapping": {
                            "norms": false,
                            "type": "text",
                            "fields": {
                                "keyword": {
                                    "type": "keyword"
                                }
                            }
                        },
                        "match_mapping_type": "string",
                        "match": "*"
                    }
                },
                {
                    "body_fields": {
                        "match": "body",
                        "mapping": {
                            "norms": false,
                            "type": "text"
                        },
                        "match_mapping_type": "object"
                    }
                }
            ],
            ...
        }
    }
}

当我尝试插入文档时,我收到MapperParsingException消息Can't get text on a START_OBJECT at...

1 个答案:

答案 0 :(得分:0)

我猜你只需要用双引号将body元素中的所有内容包装起来?像这样的东西可能有用(javascript)?

a={
    "message": "hello",
    "request": {
        "body": {
            "data": "hi",
            "some_what_dynamic": {
                "nested": {
                    "not_ending": 10000
                }
            }
        }
    }
}; 
a.request.body = JSON.stringify(a.request.body);