Сравнение строк в случае, если условие конвейера Elasticsearch не соответствует точной строке - PullRequest
0 голосов
/ 27 июня 2019

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

{
  "description": "A pipeline of pipelines for log files",
  "version": 1,
  "processors": [
    {
      "pipeline": {
        "if": """ctx.applicative_code =~ /AFA[@]959[@]333-SERVICE[@]1.0.0.SIG/ """,
        "name": "ged_pipeline"
      }
    },
    {
      "fail": {
        "message": "This pipeline requires applicative_code to be one of: 'AFA@959@333-SERVICE@1.0.0.SIG'"
      }
    }
  ]
}

Чтобы проверить его, я использую API _simulate:

POST _ingest/pipeline/logs_pipeline/_simulate
{
  "docs": [
    {
      "_source": {
        "message_log": "127.0.0.1:50613||Download||agent||S0000||PM000||Q||{5C7A4600-C422-4D81-BD02-39072E06F646}",
        "applicative_code": "AFA@959@333-SERVICE@1.0.0.SIG"
      }
    }
  ]
}

И ответ такой:

 "error" : {
        "root_cause" : [
          {
            "type" : "exception",
            "reason" : "java.lang.IllegalArgumentException: org.elasticsearch.ingest.common.FailProcessorException: This pipeline requires applicative_code to be one of: 'AFA@959@333-SERVICE@1.0.0.SIG'",
            "header" : {
              "processor_type" : "fail"
            }
          }
        ],
        "type" : "exception",
        "reason" : "java.lang.IllegalArgumentException: org.elasticsearch.ingest.common.FailProcessorException: This pipeline requires applicative_code to be one of: 'AFA@959@333-SERVICE@1.0.0.SIG'",
        "caused_by" : {
          "type" : "illegal_argument_exception",
          "reason" : "org.elasticsearch.ingest.common.FailProcessorException: This pipeline requires applicative_code to be one of: 'AFA@959@333-SERVICE@1.0.0.SIG'",
          "caused_by" : {
            "type" : "fail_processor_exception",
            "reason" : "This pipeline requires applicative_code to be one of: 'AFA@959@333-SERVICE@1.0.0.SIG'"
          }

Итак, похоже, что мое состояние не соответствует.Причина, по которой я здесь использую регулярное выражение, заключается в том, что специальный символ "@" портит сравнение строк.То, что я пробовал до сих пор, в состоянии if конвейера:

"if": """ctx.applicative_code == "AFA@959@333-SERVICE@1.0.0.SIG" """

Результат: не работает, интерпретируется символ @, и я не могу избежать его, используя \

"if": """ctx.applicative_code.compareTo("AFA@959@333-SERVICE@1.0.0.SIG") """

Результат: То же самое, @ интерпретируется

Есть идеи?

1 Ответ

0 голосов
/ 27 июня 2019

Ну, вы почти на месте, но вы неправильно понимаете, как работают конвейеры. Тот факт, что первый процессор pipeline соответствует и выполняет свою работу, не мешает запуску второго (т.е. fail). В приведенном выше конвейере оба шага выполняются всегда, поэтому вы видите ошибку.

Вам нужно выполнить шаг fail, только если условие не совпадает (вроде условия else), например:

{
  "description": "A pipeline of pipelines for log files",
  "version": 1,
  "processors": [
    {
      "pipeline": {
        "if": """ctx.applicative_code == 'AFA@959@333-SERVICE@1.0.0.SIG' """,
        "name": "ged_pipeline"
      }
    },
    {
      "fail": {
        "if": """ctx.applicative_code != 'AFA@959@333-SERVICE@1.0.0.SIG' """,
        "message": "This pipeline requires applicative_code to be one of: 'AFA@959@333-SERVICE@1.0.0.SIG'"
      }
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...