Elasti c Поля поиска c в иерархии JSON - PullRequest
1 голос
/ 26 апреля 2020

У меня будет документ JSON, где будет вложенность. Пример:

{
    "userid_int" : <integer>
    "shoes" : {
         "size_int" : <integer>,
         "brand_str" : <string>,
         "addeddate_dt" : <date>
    },
    "shirt" : {
         "size_int" : <integer>,
         "brand_str" : <string>,
         "addeddate_dt" : <date>
         "color_str" : <string>
    },
    ...
}

Нет ограничений на количество вложенных полей. Например, мне может понадобиться новый ключ «пижама» для конкретного документа. Но это неизвестно заранее, пока создается индекс.

Все, что я хочу знать, - это если динамическое c сопоставление полей применимо к JSON, в том числе внутри вложения на какие-либо уровни, ИЛИ нет?

Будет ли это отображение работать для всех _int / _str / et c поля внутри вложенных полей?

PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "_int_as_integers": {
          "match":   "*_int",
          "mapping": {
            "type": "integer"
          }
        },
        "_str_as_strings": {
          "match":   "*_str",
          "mapping": {
            "type": "string"
          }
        },
        ...
      }
    ]
  }
}

1 Ответ

1 голос
/ 26 апреля 2020

Это зависит от того, что вы подразумеваете под nested. Есть то, что я называю тривиальным вложенным состоянием, при котором у вас есть объекты внутри объектов, и есть синтаксис c вложенного типа, который имеет выделенный тип и некоторые присущие ему свойства, наиболее важным из которых является способность обрабатывать вложенные подобъекты как полностью отдельные. Предостережение заключается в том, что запросы должны соответствовать определенному синтаксису .

Два замечания:

  • ваш шаблон Dynami c был почти правильным - Просто убедитесь, что отдельные шаблоны являются отдельными определениями объектов (см. ниже)
  • тип string был устарел некоторое время в пользу text

  1. Тривиальная вложенность
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...