Почему массив добавляется в массив безболезненным скриптом? - PullRequest
0 голосов
/ 04 ноября 2018

Используя Logstash, моя цель состоит в том, чтобы проиндексировать документ, если временная метка для этого документа еще не была проиндексирована, в противном случае, если документ существует, а временная метка отсутствует в массиве, затем добавьте массив временной метки. Моя проблема в том, что массив добавляется в массив.

т.е. моя строка входного журнала всегда одинакова, КРОМЕ для отметки времени, которую я хочу добавить к тому же документу в Elastic.

Вот мои входные данные.

  • Обратите внимание, что отметка времени является строкой.
  • Поле «хэш» станет идентификатором документа (только для примера)

    {"timestamp":"1534023333", "hash":"1"}
    {"timestamp":"1534022222", "hash":"1"}
    {"timestamp":"1534011111", "hash":"1"}
    

Вот мой конфиг Logstash:

  • Поле метки времени разделено, что превращает его в массив.
  • При первом просмотре документ индексируется. В следующий раз это видно, скрипт запускается.
  • Скрипт проверяет наличие значения метки времени, а если нет, добавить.
  • params.event.get используется, потому что он предотвращает динамическую компиляцию скрипта

    input {
      file {
        path => "timestamp.json"
        start_position => "beginning"
        codec => "json"
      }
    }
    
    filter {
        mutate {
            split => { "timestamp" => "," }
        }
    }
    
    output {
      elasticsearch {
        hosts => ["http://127.0.0.1:9200"]
        index => "test1"
        document_id => "%{[hash]}"
        doc_as_upsert => true
        script =>     'if(ctx._source.timestamp.contains(params.event.get("timestamp"))) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")))'
        action => "update"
        retry_on_conflict=>3
    
      }
      #stdout { codec => rubydebug }
    }
    

Вот вывод.

  • Обратите внимание, что отметка времени является массивом. Но каждое значение добавляется к массив как массив.

     "timestamp": [
          "1534011111",
          [
            "1534022222"
          ],
          [
            "1534023333"
          ]
        ],
    

То, что я хочу, - это вывод:

 "timestamp": [
      "1534011111",
      "1534022222"
      "1534023333"
    ],

Как получить желаемый результат? Я использую Elasticsearch 6.4.2 и Logstash 6.4.2.

1 Ответ

0 голосов
/ 05 ноября 2018

Проблема в том, что split => { "timestamp" => "," } преобразует поле timestamp в массив, а метод add берет объект и добавляет его к исходному массиву (он не объединяет два массива).

В безболезненной попытке получить доступ к первому элементу массива timestamp так: if(ctx._source.timestamp.contains(params.event.get("timestamp")[0])) return true; else (ctx._source.timestamp.add(params.event.get("timestamp")[0]))

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