Elasticsearch пользовательское отображение определения - PullRequest
0 голосов
/ 10 октября 2018

Я должен загрузить данные в elk в следующем формате:

{
  "location":{
    "timestamp":1522751098000,
    "resources":[
      {
         "resource":{
           "name":"Node1"
          },
          "probability":0.1
      },
      {
        "resource":{
          "name":"Node2"
         },
        "probability":0.01
      }]
  }
}

Я пытаюсь определить отображение данных такого типа, и я создал следующее отображение:

{
 "mappings": {
   "doc": {
     "properties": {
        "location": {
           "properties" : {
              "timestamp": {"type": "date"},
              "resources": []
           }
         }
     }
  }
}

У меня есть 2 вопроса:

  1. как я могу определить массив ресурсов в моем отображении?
  2. возможно ли определить пользовательский тип (например, ресурс) и использовать этот тип в моем отображении (например, "resources": [{type:resource}])?

1 Ответ

0 голосов
/ 10 октября 2018

Есть много вещей, которые нужно знать о картировании Elasticsearch.Я действительно настоятельно рекомендую сначала прочитать хотя бы некоторые из их документации .

Короткие ответы, если вам все равно:

  1. Elasticsearch автоматически позволяет хранить одно или несколько значений определенных объектов, нет необходимости указывать массив.См. Маркер 1 или обратитесь к их документации по типам массивов .
  2. Я не думаю, что это так.Поскольку Elasticsearch 6 разрешен только 1 тип на индекс.Вложенные объекты, вероятно, самые близкие, но вы определяете их в одном файле.Вложенные объекты хранятся в отдельном индексе (внутри).

Длинный ответ и некоторые мысли

Посмотрите на следующее отображение:

"mappings": {
    "doc": {
        "properties": {
            "location": {
                "properties": {
                    "timestamp": {
                        "type": "date"
                    },
                    "resources": { [1]
                        "type": "nested", [2]
                        "properties": {
                            "resource": {
                                "properties": {
                                    "name": { [3]
                                        "type": "text"
                                    }
                                }
                            },
                            "probability": {
                                "type": "float"
                            }
                        }
                    }
                }
            }
        }
    }
}

Так может выглядеть ваше отображение.Это может быть сделано по-другому, но я думаю, что это имеет смысл таким образом - возможно, за исключением маркера 3. Я подойду к этому прямо сейчас:

Маркер 1: Если вы определите поле,Вы обычно даете это тип.Я определил resources как тип nested, но ваш timestamp имеет тип date.Elasticsearch автоматически позволяет хранить одно или несколько значений этих объектов.timestamp может также содержать массив dates, не нужно указывать массив .

Маркер 2: Я определил resources кактип nested, но это также может быть объект типа resource чуть ниже (где тип не указан).Читайте о вложенных объектах здесь .В конце концов, я не знаю, как будут выглядеть ваши запросы, поэтому не уверен, действительно ли вам нужен вложенный тип.

Маркер 3: Я хочу рассмотреть две вещи здесь.Во-первых, я хочу еще раз упомянуть, что resource определяется как обычный объект со свойством name.Вы могли бы сделать это и для resources.

Второе - это скорее наводящий на размышления импульс: не принимайте это слишком серьезно, если что-то абсолютно не соответствует вашему случаю.Просто примите это как мнение.

Эта структура отображения выглядит очень вдохновленной подходом реляционных баз данныхЯ думаю, что вы обычно хотите определить структуры документа для эластичного поиска больше для ожидаемых поисков.Избыточность не является проблемой, но вложенные объекты могут усложнить ваши запросы.Я думаю, что я опустил бы всю часть ресурсов и сделал бы что-то вроде этого:

"mappings": {
    "doc": {
        "properties": {
            "location": {
                "properties": {
                    "timestamp": {
                        "type": "date"
                    },
                    "resource": {
                        "properties": {
                            "resourceName": {
                                "type": "text"
                            }
                            "resourceProbability": {
                                "type": "float"
                            }
                        }
                    }
                }
            }
        }
    }
}

Потому что, как я сказал, в этом случае resource может содержать массив объектов, каждый из которых имеет resourceName иresourceProbability.

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