2016-05-31 2 views
0

Я полностью новый с стеком ELK и особенно с ES. Я пытаюсь импортировать JSON-файл, который я получил с помощью API-интерфейса Google Admin SDK, и я хочу импортировать его в Elasticsearch.Импортировать файл API Google JSON в Elasticsearch

До сих пор это структура JSON моих данных:

{ 
"kind": "reports#activities", 
"nextPageToken": string, 
"items": [ 
{ 
"kind": "audit#activity", 
    "id": { 
    "time": datetime, 
    "uniqueQualifier": long, 
    "applicationName": string, 
    "customerId": string 
    }, 
    "actor": { 
    "callerType": string, 
    "email": string, 
    "profileId": long, 
    "key": string 
    }, 
    "ownerDomain": string, 
    "ipAddress": string, 
    "events": [ 
    { 
     "type": string, 
     "name": string, 
     "parameters": [ 
     { 
      "name": string, 
      "value": string, 
      "intValue": long, 
      "boolValue": boolean 
     } 
     ] 
    } 
    ] 
    } 
] 
} 

Так что я решил сначала использовать эту команду, чтобы загрузить файл в формате JSON в ES:

curl -s -XPOST 'localhost:9200/_bulk' --data-binary @documents.json 

Но я получаю некоторые ошибки :

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Malformed action/metadata line [1], expected START_OBJECT or END_OBJECT but found [START_ARRAY]"}],"type":"illegal_argument_exception","reason":"Malformed action/metadata line [1], expected START_OBJECT or END_OBJECT but found [START_ARRAY]"},"status":400} 

Что мне делать?

Благодарим за помощь!

ответ

0

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

curl -XPUT localhost:9200/reports -d '{ 
    "nextPageToken": { 
    "type": "string" 
    }, 
    "items": { 
    "properties": { 
     "kind": { 
     "type": "string" 
     }, 
     "id": { 
     "properties": { 
      "time": { 
      "type": "date", 
      "format": "date_time" 
      }, 
      "uniqueQualifier": { 
      "type": "long" 
      }, 
      "applicationName": { 
      "type": "string" 
      }, 
      "customerId": { 
      "type": "string" 
      } 
     } 
     }, 
     "actor": { 
     "properties": { 
      "callerType": { 
      "type": "string" 
      }, 
      "email": { 
      "type": "string" 
      }, 
      "profileId": { 
      "type": "long" 
      }, 
      "key": { 
      "type": "string" 
      } 
     } 
     }, 
     "ownerDomain": { 
     "type": "string" 
     }, 
     "ipAddress": { 
     "type": "string" 
     }, 
     "events": { 
     "properties": { 
      "type": { 
      "type": "string" 
      }, 
      "name": { 
      "type": "string" 
      }, 
      "parameters": { 
      "properties": { 
       "name": { 
       "type": "string" 
       }, 
       "value": { 
       "type": "string" 
       }, 
       "intValue": { 
       "type": "long" 
       }, 
       "boolValue": { 
       "type": "boolean" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
}' 

Это делается, теперь вы можете индексировать reports#activities документов, которые следуют выше структуре, используя насыпной вызов. Синтаксис массовых вызовов точно определен here, то есть вам нужна командная строка (что делать), которая следует в следующей строке источником документа (что индексировать), которая не должна содержать никаких новых строк!

Итак, вам необходимо переформатировать файл documents.json (обязательно добавьте новую строку после второй строки). Также обратите внимание, что я добавил некоторые фиктивные данные, чтобы проиллюстрировать этот процесс:

{"index": {"_index": "reports", "_type": "activity"}} 
{"kind":"reports#activities","nextPageToken":"string","items":[{"kind":"audit#activity","id":{"time":"2016-05-31T00:00:00.000Z","uniqueQualifier":1,"applicationName":"string","customerId":"string"},"actor":{"callerType":"string","email":"string","profileId":1,"key":"string"},"ownerDomain":"string","ipAddress":"string","events":[{"type":"string","name":"string","parameters":[{"name":"string","value":"string","intValue":1,"boolValue":true}]}]}]} 
+0

Спасибо за подсказку Val! На самом деле мои данные JSON содержат массивы (элементы [], события [] и параметры []), поэтому я немного изменил ваш код относительно создания индекса, заменив некоторые фигурные скобки на скобки, и он сработал! – Felz

+0

Нет, вы не должны, это было сделано специально, ES создаст эти массивы для вас;) См. [This] (https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html) – Val

Смежные вопросы