Текущий токен (START_OBJECT) не булева типа - массовая вставка эластичного поиска - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть следующий ванильный код Node.js:

  const lst = vals.map(v => {
    return [{index: {}}, {value: v}];
  });

  const flt = flattenDeep([lst]);

  req.post('/foo/_bulk', {}, flt, (err, v) => {
    log.info(err,v);
  });

Я получаю эту ошибку:

Текущий токен (START_OBJECT) не логического типа

подробно:

   app:es ERROR  {   errors: true,   items: [
    {
      index: {
        _id: '4Z6ZS20Bd2MYc8MzjK-O',
        _index: 'foo',
        _type: '_doc',
        error: {
          caused_by: {
            reason: 'Current token (START_OBJECT) not of boolean type\n' +
              ' at [Source: org.elasticsearch.common.bytes.BytesReference$MarkSupportingStreamInputWrapper@4c9fb11; line: 1, column: 11]',
            type: 'i_o_exception'
          },
          reason: "failed to parse field [value] of type [boolean] in document with id '4Z6ZS20Bd2MYc8MzjK-O'. Preview of field's value: '{date=unknown, @bunion=true, level=WARN, appName=unknown, @version=-1, host=unknown, pid=-1, _id=5d83fe5878bbe129e1cf9444, fields=null, value=foo}'",
          type: 'mapper_parsing_exception'
        },
        status: 400
      }
    }   ],   took: 5 }

Кто-нибудь знает, почему ему не нравится мой массив?Массив lst имеет только один элемент:

[{index:{},{value:'foo'}]

, с чем это может вызвать проблемы?

Если я изменю его на:

  const lst = vals.map(v => {
    return [{index: true}, {value: v}];
  });

, тогда явместо этого получите эту ошибку:

Неправильная строка действия / метаданных [1], ожидаемый START_OBJECT или END_OBJECT, но найденный [VALUE_BOOLEAN]

объект flt выглядит следующим образом:

 flt: [
    {
      index: {}
    },
    {
      value: {
        '@bunion': true,
        '@version': -1,
        _id: 5d84039dc98ff82d30337e6c,
        appName: 'unknown',
        date: 'unknown',
        fields: null,
        host: 'unknown',
        level: 'WARN',
        pid: -1,
        value: 'foo'
      }
    }
  ]

и затем я записываю массив в запрос следующим образом:

  for (const v of flt) {
    req.write(JSON.stringify(v));
    req.write('\n');
  }

хорошо, так что, когда я делаю это, это работает:

  const lst = vals.map(v => {
    return [{index: {}}, {value: true}];  // value is boolean now!
  });

но почему ??

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Массовые данные API должны быть отформатированы, как показано ниже

{"index" : {}}
{"name": "Carlson Barnes", "age": 34}
{"index":{}}
{"name": "Sheppard Stein","age": 39}
{"index":{}}
{"name": "Nixon Singleton","age": 36}
{"index":{}}
{"name": "Sharron Sosa","age": 33}
{"index":{}}
{"name": "Kendra Cabrera","age": 24}
{"index":{}}
{"name": "Young Robinson","age": 20}

Поэтому измените код следующим образом

  const lst = vals.map(v => {
    return [{index: {}}, v];
  });

Пример пользовательского интерфейса Kibana

Операция вставки

enter image description here

И его выход

enter image description here

0 голосов
/ 20 сентября 2019

Хорошо, похоже, это сработало, когда я сделал это:

  const lst = vals.map(v => {
    return [{index: {}}, {create: v}];
  });

ответ был:

app:es INFO  result: {
  errors: false,
  items: [
    {
      index: {
        _id: '6J7ZS20Bd2MYc8Mzya82',
        _index: 'foo',
        _primary_term: 2,
        _seq_no: 72,
        _shards: {
          failed: 0,
          successful: 2,
          total: 2
        },
        _type: '_doc',
        _version: 1,
        result: 'created',
        status: 201
      }
    }
  ],
  took: 31
}

хорошо, возможно, нет, теперь всенаходится внутри свойства "create":

enter image description here

Хорошо, поэтому я выяснил проблему .Проблема заключается в том, что у ES есть дерьмовый API.Если у вашего объекта есть свойство под названием «значение», то ES ожидает, что оно будет логическим.Таким образом, ответ, похоже, заключается в том, чтобы обернуть ваши данные в безопасный ключ, может быть, не «создать», а что-то короткое, например «val» (но не чертовски «значение» (придурки)).

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