Jer
Jer

Reputation: 5658

How can I add heterogeneous data to Elasticsearch?

I am trying to add heterogenous data (i.e. of different "types") to Elasticsearch. Each (top-level) object contains a user's settings for an application. A simplified example is:

{
'name':'test',
'settings': [
    {
        'key':'color',
        'value':'blue'
    },
    {
        'key':'isTestingMode',
        'value':true
    },
    {
        'visibleColumns',
        'value': [
            'column1',
            'column3',
            'column4',
        ]
    },
    ...
    ...
}

When I try to add this, the POST fails with an MapperParsingException. Searching around, it seems like this is because the 'value' field has different types.

Is there any way to just store arbitrary data like this?

Upvotes: 0

Views: 565

Answers (1)

Vineeth Mohan
Vineeth Mohan

Reputation: 19283

This is not possible. Mapping is per field and mapping is not array aware. This means that you can keep settings.value as string or array but not both.

An easy tweak would be to define all value as array -

{
'name':'test',
'settings': [
    {
        'key':'color',
        'value': [ 'blue' ]
    },
    {
        'key':'isTestingMode',
        'value': [ true ] 
    },
    {
        'visibleColumns',
        'value': [
            'column1',
            'column3',
            'column4',
        ]
    },
    ...
    ...
}

If that is not acceptable , then another idea would be to apply source transform which will do this normalization to the settings.value field before it is indexed. This way , the source is kept as it is AND you will get what you want.

Upvotes: 1

Related Questions