Это зависит от того, что вы подразумеваете под nested
. Есть то, что я называю тривиальным вложенным состоянием, при котором у вас есть объекты внутри объектов, и есть синтаксис c вложенного типа, который имеет выделенный тип и некоторые присущие ему свойства, наиболее важным из которых является способность обрабатывать вложенные подобъекты как полностью отдельные. Предостережение заключается в том, что запросы должны соответствовать определенному синтаксису .
Два замечания:
- ваш шаблон Dynami c был почти правильным - Просто убедитесь, что отдельные шаблоны являются отдельными определениями объектов (см. ниже)
- тип
string
был устарел некоторое время в пользу text
- Тривиальная вложенность
PUT trivial_nestedness
{
"mappings": {
"dynamic_templates": [
{
"int_as_integers": {
"path_match": "*.*_int",
"mapping": {
"type": "integer"
}
}
},
{
"str_as_strings": {
"path_match": "*.*_str",
"mapping": {
"type": "text"
}
}
}
]
}
}
POST trivial_nestedness/_doc
{
"userid_int" : 123,
"shoes" : {
"size_int" : 456,
"brand_str" : "str",
"addeddate_dt" : "2020/04/25 00:00:00"
},
"shirt" : {
"size_int" : 123939,
"brand_str" : "str",
"addeddate_dt" : "2020/04/25 00:00:00",
"color_str" : "red"
}
}
затем
GET trivial_nestedness/_mapping
, уступающая
{
"trivial_nestedness" : {
"mappings" : {
"dynamic_templates" : [
...
],
"properties" : {
"shirt" : {
"properties" : {
"addeddate_dt" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"brand_str" : {
"type" : "text"
},
"color_str" : {
"type" : "text"
},
"size_int" : {
"type" : "integer"
}
}
},
"shoes" : {
"properties" : {
"addeddate_dt" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"brand_str" : {
"type" : "text"
},
"size_int" : {
"type" : "integer"
}
}
},
"userid_int" : {
"type" : "long"
}
}
}
}
}
Syntacti c nested-ness
PUT syntactic_nestedness
{
"mappings": {
"dynamic_templates": [
{
"possibly_nested_obj": {
"match": "*_nested",
"mapping": {
"type": "nested"
}
}
},
{
"int_as_integers": {
"path_match": "*_nested.*_int",
"mapping": {
"type": "integer"
}
}
},
{
"str_as_strings": {
"path_match": "*_nested.*_str",
"mapping": {
"type": "text"
}
}
}
]
}
}
В этом случае каждый shoes
, shirt
, ... объект имеет суффикс _nested
, чтобы четко указать его тип и, что более важно, представляет собой массив из множества возможных элементов, которые считаются отдельными объектами.
POST syntactic_nestedness/_doc
{
"userid_int": 123,
"shoes_nested": [
{
"size_int": 456,
"brand_str": "str",
"addeddate_dt": "2020/04/25 00:00:00"
}
],
"shirt_nested": [
{
"size_int": 123939,
"brand_str": "str",
"addeddate_dt": "2020/04/25 00:00:00",
"color_str": "red"
}
]
}
Затем
GET syntactic_nestedness/_mapping
проверка того, что мы получили действительно вложенные объекты
{
"syntactic_nestedness" : {
"mappings" : {
"dynamic_templates" : [
...
],
"properties" : {
"shirt_nested" : {
"type" : "nested",
"properties" : {
"addeddate_dt" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"brand_str" : {
"type" : "text"
},
"color_str" : {
"type" : "text"
},
"size_int" : {
"type" : "integer"
}
}
},
"shoes_nested" : {
"type" : "nested",
"properties" : {
"addeddate_dt" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"brand_str" : {
"type" : "text"
},
"size_int" : {
"type" : "integer"
}
}
},
"userid_int" : {
"type" : "long"
}
}
}
}
}
Наконец, хотя я выбрал суффикс _nested
в основном для ясности, я также хотел избежать клавиш верхнего уровня, таких как userid_int
. Это, однако, может быть элегантно решено с помощью ваших клавиш match patterns
.