Временные метки Elasticsearch и Laravel scout-elasticsearch-driver имеют неверную ошибку

Неудовлетворенный другими красивыми принтерами для Ruby, я написал свой собственный ( NeatJSON ), а затем поместил его на JavaScript , включая бесплатный онлайн-форматтер ,

Функции (все необязательные):

  • Установите ширину линии и заверните ее способом, который сохраняет объекты и массивы на одна и та же строка, когда они подходят, обертывая одно значение на линию, когда они этого не делают.
  • Сортировка ключей объекта, если хотите.
  • Выровнять объектные ключи (выровнять двоеточия).
  • Отформатируйте числа с плавающей запятой на определенное число десятичных знаков, не испорчив целые числа.
  • Режим «коротких» оберток помещает открывающие и закрывающие скобки / фигурные скобки в той же строке, что и значения, обеспечивая формат, который некоторые предпочитают.
  • Гранулированное управление интервалом для массивов и объектов между скобками, до / после двоеточий и запятых.
  • Функция предоставляется как для веб-браузеров, так и для Node.js .

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

(function(exports){
exports.neatJSON = neatJSON;

function neatJSON(value,opts){
  opts = opts || {}
  if (!('wrap'          in opts)) opts.wrap = 80;
  if (opts.wrap==true) opts.wrap = -1;
  if (!('indent'        in opts)) opts.indent = '  ';
  if (!('arrayPadding'  in opts)) opts.arrayPadding  = ('padding' in opts) ? opts.padding : 0;
  if (!('objectPadding' in opts)) opts.objectPadding = ('padding' in opts) ? opts.padding : 0;
  if (!('afterComma'    in opts)) opts.afterComma    = ('aroundComma' in opts) ? opts.aroundComma : 0;
  if (!('beforeComma'   in opts)) opts.beforeComma   = ('aroundComma' in opts) ? opts.aroundComma : 0;
  if (!('afterColon'    in opts)) opts.afterColon    = ('aroundColon' in opts) ? opts.aroundColon : 0;
  if (!('beforeColon'   in opts)) opts.beforeColon   = ('aroundColon' in opts) ? opts.aroundColon : 0;

  var apad  = repeat(' ',opts.arrayPadding),
      opad  = repeat(' ',opts.objectPadding),
      comma = repeat(' ',opts.beforeComma)+','+repeat(' ',opts.afterComma),
      colon = repeat(' ',opts.beforeColon)+':'+repeat(' ',opts.afterColon);

  return build(value,'');

  function build(o,indent){
    if (o===null || o===undefined) return indent+'null';
    else{
      switch(o.constructor){
        case Number:
          var isFloat = (o === +o && o !== (o|0));
          return indent + ((isFloat && ('decimals' in opts)) ? o.toFixed(opts.decimals) : (o+''));

        case Array:
          var pieces  = o.map(function(v){ return build(v,'') });
          var oneLine = indent+'['+apad+pieces.join(comma)+apad+']';
          if (opts.wrap===false || oneLine.length<=opts.wrap) return oneLine;
          if (opts.short){
            var indent2 = indent+' '+apad;
            pieces = o.map(function(v){ return build(v,indent2) });
            pieces[0] = pieces[0].replace(indent2,indent+'['+apad);
            pieces[pieces.length-1] = pieces[pieces.length-1]+apad+']';
            return pieces.join(',\n');
          }else{
            var indent2 = indent+opts.indent;
            return indent+'[\n'+o.map(function(v){ return build(v,indent2) }).join(',\n')+'\n'+indent+']';
          }

        case Object:
          var keyvals=[],i=0;
          for (var k in o) keyvals[i++] = [JSON.stringify(k), build(o[k],'')];
          if (opts.sorted) keyvals = keyvals.sort(function(kv1,kv2){ kv1=kv1[0]; kv2=kv2[0]; return kv1kv2?1:0 });
          keyvals = keyvals.map(function(kv){ return kv.join(colon) }).join(comma);
          var oneLine = indent+"{"+opad+keyvals+opad+"}";
          if (opts.wrap===false || oneLine.lengthkv2?1:0 });
            keyvals[0][0] = keyvals[0][0].replace(indent+' ',indent+'{');
            if (opts.aligned){
              var longest = 0;
              for (var i=keyvals.length;i--;) if (keyvals[i][0].length>longest) longest = keyvals[i][0].length;
              var padding = repeat(' ',longest);
              for (var i=keyvals.length;i--;) keyvals[i][0] = padRight(padding,keyvals[i][0]);
            }
            for (var i=keyvals.length;i--;){
              var k=keyvals[i][0], v=keyvals[i][1];
              var indent2 = repeat(' ',(k+colon).length);
              var oneLine = k+colon+build(v,'');
              keyvals[i] = (opts.wrap===false || oneLine.length<=opts.wrap || !v || typeof v!="object") ? oneLine : (k+colon+build(v,indent2).replace(/^\s+/,''));
            }
            return keyvals.join(',\n') + opad + '}';
          }else{
            var keyvals=[],i=0;
            for (var k in o) keyvals[i++] = [indent+opts.indent+JSON.stringify(k),o[k]];
            if (opts.sorted) keyvals = keyvals.sort(function(kv1,kv2){ kv1=kv1[0]; kv2=kv2[0]; return kv1kv2?1:0 });
            if (opts.aligned){
              var longest = 0;
              for (var i=keyvals.length;i--;) if (keyvals[i][0].length>longest) longest = keyvals[i][0].length;
              var padding = repeat(' ',longest);
              for (var i=keyvals.length;i--;) keyvals[i][0] = padRight(padding,keyvals[i][0]);
            }
            var indent2 = indent+opts.indent;
            for (var i=keyvals.length;i--;){
              var k=keyvals[i][0], v=keyvals[i][1];
              var oneLine = k+colon+build(v,'');
              keyvals[i] = (opts.wrap===false || oneLine.length<=opts.wrap || !v || typeof v!="object") ? oneLine : (k+colon+build(v,indent2).replace(/^\s+/,''));
            }
            return indent+'{\n'+keyvals.join(',\n')+'\n'+indent+'}'
          }

        default:
          return indent+JSON.stringify(o);
      }
    }
  }

  function repeat(str,times){ // http://stackoverflow.com/a/17800645/405017
    var result = '';
    while(true){
      if (times & 1) result += str;
      times >>= 1;
      if (times) str += str;
      else break;
    }
    return result;
  }
  function padRight(pad, str){
    return (str + pad).substring(0, pad.length);
  }
}
neatJSON.version = "0.5";

})(typeof exports === 'undefined' ? this : exports);

0
задан Jorn 13 July 2018 в 07:56
поделиться

1 ответ

В вашем сопоставлении вы определили пользовательский формат даты (yyyy-MM-DD HH:mm:ss) для created_at и updated_at. Поля raw также являются типом даты, но используют формат по умолчанию (который в соответствии с doc является date_optional_time , что означает yyyy-MM-DD'T'HH:mm:ss).

Это означает, что первый ожидает 2018-07-13 07:52:02, в то время как последний 2018-07-13T07:52:02, поэтому вы индексирование не можете избежать нарушения одного из двух.

Теперь использование поля предназначены для индексирования значений по-разному, но вы делаете это, чтобы создать новое поле raw с в основном теми же свойствами базового значения (они оба являются типами даты, кроме для несогласованности в формате, конечно).

Итак, по-моему, у вас есть варианты:

  1. , если у вас нет специального использования для raw вы можете удалить его из отображения. Сортировка и сопоставление хорошо работает с базовым полем.
    "created_at": {"type": "date", "format": "yyyy-MM-DD HH:mm:ss"}
    
  2. , если вам нужно сохранить исходный формат строки (как может показаться «raw»), вы можете использовать тип ключевого слова
    "created_at": {"type": "date", "format": "yyyy-MM-DD HH:mm:ss", "fields": {"raw": {"type": "keyword"}}}
    
  3. , если вам действительно нужен raw как есть, вы должны указать формат, который согласуется с другим:
    "created_at": {"type": "date", "format": "yyyy-MM-DD HH:mm:ss", "fields": {"raw": {"type": "date", "format": "yyyy-MM-DD HH:mm:ss"}}}
    
2
ответ дан Batsu 17 August 2018 в 13:23
поделиться
  • 1
    Спасибо за Ваш ответ. Я не уверен, что понимаю. При удалении необработанного поля он будет давать ошибку, когда я обновляю сопоставление: «незаконное поле [тип], только поля могут быть указаны внутри полей». Я полностью удалил поле «поля» и добавил поле индекса, теперь он работает, но это правильный путь? 'created_at' = & gt; ['type' = & gt; 'date', 'format' = & gt; 'yyyy-MM-dd HH: mm: ss', 'index' = & gt; 'not_analyzed',] – Jorn 13 July 2018 в 11:27
  • 2
    Я обновил ответ более подробно – Batsu 13 July 2018 в 14:13
  • 3
Другие вопросы по тегам:

Похожие вопросы: