Сбой агрегации метрик по сценарию при неожиданном = символе

#elasticsearch #elasticsearch-5

#elasticsearch #elasticsearch-5

Вопрос:

Я пытаюсь создать некоторый объект, содержащий все временные интервалы между двумя журналами с одинаковым идентификатором записи.

Для этого я выполняю следующий запрос (скриптовая агрегация метрик) в elastic search, где находятся журналы, используя fiddler:

 {
    "query": {
        "exists": {
            "field": "recordId"
        }
    },
    "aggs": {
        "deltas": {
            "scripted_metric": {
                "init_script": {
                    "source": "state.deltas = {};",
                    "lang": "expression"
                },
                "map_script": {
                    "source": " if (!(doc['topic'].value in state.deltas)) { state.deltas[doc['topic'].value] = {} } state.deltas[doc['topic'].value][doc['recordId'].value] = !(doc['recordId'].value in state.deltas[doc['topic'].value]) ? doc['@timestamp'].date.millisOfDay : Math.abs(state.deltas[doc['topic'].value][doc['recordId'].value] - doc['@timestamp'].date.millisOfDay) ",
                    "lang": "expression"
                },
                "reduce_script": {
                    "source": " res = {}; for (s in states) { for(topic in Object.keys(s.deltas)) { if (!(topic in res)) { res[topic] = {} } for(recordId in Object.keys(s.deltas[topic])) { res[topic][recordId] = !(recordId in res[topic]) ? s.deltas[topic][recordId] : Math.abs(res[topic][recordId] - s.deltas[topic][recordId]) } } } return res;",
                    "lang": "expression"
                }
            }
        }
    }
}
  

Но это не удается из-за неожиданного символа ‘=’…
Пробовал другие способы, но всегда выдает одну и ту же ошибку.

Чего мне не хватает?

 {
  "error": {
    "root_cause": [
      {
        "type": "lexer_no_viable_alt_exception",
        "reason": "lexer_no_viable_alt_exception: null"
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "il0:il1-sys-logs-2020.10.07",
        "node": "5bmIYI_iSVCtx41qEEbASg",
        "reason": {
          "type": "script_exception",
          "reason": "compile error",
          "script_stack": [
            "state.deltas = {};",
            "             ^---- HERE"
          ],
          "script": "state.deltas = {};",
          "lang": "expression",
          "caused_by": {
            "type": "parse_exception",
            "reason": "parse_exception: unexpected character '= ' on line (1) position (13)",
            "caused_by": {
              "type": "lexer_no_viable_alt_exception",
              "reason": "lexer_no_viable_alt_exception: null"
            }
          }
        }
      }
    ],
    "caused_by": {
      "type": "lexer_no_viable_alt_exception",
      "reason": "lexer_no_viable_alt_exception: null"
    }
  },
  "status": 500
}
  

Комментарии:

1. В чем причина отказа от использования painless вместо expression ?

2. Просто потому, что его синтаксис более удобен при обработке дат

3. Похоже, вы используете выражения даты lucene ( elastic.co/guide/en/elasticsearch/reference/current / … ), которые действительны и в безболезненном режиме! Попробуйте безболезненно — я знаю об этом больше, чем expression и, возможно, могу помочь.