Modeling Objects That Have Many Properties


(Peter Hodgman) #1

Hello,

I have a situation where I want to understand the best way to model this
data in ES. I have the following data

Object -> Has Many -> Properties

where a

Property -> is a -> Name (String), and a Value( one of -> Boolean,
Integer, Double, String, Long)

and the Object is the container of the properties via the "the-properties"
field below. It also has a simple name field "the-name" as a general object
identifier.

So essentially I have an object that has many properties where each
property can have a name, and a value but the value can be one of many
types as noted above. So this is a bit dynamic in nature as it relates to
the properties value "type".

One way to establish a mapping is as follows, but it seems a bit hacky. Is
there a better way?

curl -XPUT 'http://localhost:9200/bo-objects/_mapping/bo' -d '{
"bo": {
"properties": {
"the-name" : {
"type" : "string",
"store" : true
},
"the-properties": {
"type" : "nested",
"properties" : {
"name" : {
"type" : "string",
"store" : true
},
"value" : {
"type" : "object",
"properties" : {
"as_double" : { "type": "double", "store": true} ,
"as_int" : { "type": "integer", "store": true} ,
"as_string" : { "type": "string", "store": true} ,
"as_bool" : { "type": "boolean", "store": true}
}
}
}
}
}
}
}'

which results in an ES data structure like this..

  • "_source": {
    • "name": "My Object",
    • "properties": [
      • {
        • "name": "foo",
        • "value": {
          • "as_double": 23.56
            }
            },
      • {
        • "name": "bar",
        • "value": {
          • "as_bool": false
            }
            },
      • {
        • "name": "bla",
        • "value": {
          • "as_double": 22.56
            }
            },
      • {
        • "name": "junk",
        • "value": {
          • "as_double": 8.56
            }
            },
      • {
        • "name": "fee",
        • "value": {
          • "as_string": "D6677"
            }
            }
            ]
            }

}

Thanks

--
Please update your bookmarks! We have moved to https://discuss.elastic.co/

You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/6fdbfe26-4032-4664-91ce-582a0d832bf4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(Mark Walkom) #2

You probably want to use parent/child instead, that way you don't have to
update the entire document each time, just the child(ren).

PS - We're moving to https://discuss.elastic.co/, please join us there for
any future discussions!

On 15 May 2015 at 22:52, Peter Hodgman peter.hodgman@gmail.com wrote:

Hello,

I have a situation where I want to understand the best way to model this
data in ES. I have the following data

Object -> Has Many -> Properties

where a

Property -> is a -> Name (String), and a Value( one of -> Boolean,
Integer, Double, String, Long)

and the Object is the container of the properties via the "the-properties"
field below. It also has a simple name field "the-name" as a general object
identifier.

So essentially I have an object that has many properties where each
property can have a name, and a value but the value can be one of many
types as noted above. So this is a bit dynamic in nature as it relates to
the properties value "type".

One way to establish a mapping is as follows, but it seems a bit hacky. Is
there a better way?

curl -XPUT 'http://localhost:9200/bo-objects/_mapping/bo' -d '{
"bo": {
"properties": {
"the-name" : {
"type" : "string",
"store" : true
},
"the-properties": {
"type" : "nested",
"properties" : {
"name" : {
"type" : "string",
"store" : true
},
"value" : {
"type" : "object",
"properties" : {
"as_double" : { "type": "double", "store": true} ,
"as_int" : { "type": "integer", "store": true} ,
"as_string" : { "type": "string", "store": true} ,
"as_bool" : { "type": "boolean", "store": true}
}
}
}
}
}
}
}'

which results in an ES data structure like this..

  • "_source": {
    • "name": "My Object",
    • "properties": [
      • {
        • "name": "foo",
        • "value": {
          • "as_double": 23.56
            }
            },
      • {
        • "name": "bar",
        • "value": {
          • "as_bool": false
            }
            },
      • {
        • "name": "bla",
        • "value": {
          • "as_double": 22.56
            }
            },
      • {
        • "name": "junk",
        • "value": {
          • "as_double": 8.56
            }
            },
      • {
        • "name": "fee",
        • "value": {
          • "as_string": "D6677"
            }
            }
            ]
            }

}

Thanks

--
Please update your bookmarks! We have moved to https://discuss.elastic.co/

You received this message because you are subscribed to the Google Groups
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an
email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msgid/elasticsearch/6fdbfe26-4032-4664-91ce-582a0d832bf4%40googlegroups.com
https://groups.google.com/d/msgid/elasticsearch/6fdbfe26-4032-4664-91ce-582a0d832bf4%40googlegroups.com?utm_medium=email&utm_source=footer
.
For more options, visit https://groups.google.com/d/optout.

--
Please update your bookmarks! We have moved to https://discuss.elastic.co/

You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/CAEYi1X_sGhLc%2BxtdbmzAUWDAPOByNBZHSSy%3DiFUS4fne0Vc_%2Bg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.


(system) #3