Возможно ли получить доступ к полю за пределами _source в конвейере приема elasticsearch

#elasticsearch #elasticsearch-painless

Вопрос:

У меня возникли проблемы с созданием канала приема в elasticstack, который имеет доступ к полям за пределами _source объекта. Я использую elasticstack 7.8. Вот тривиальный пример:

 POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
         "set": {
            "field": "foo_found",
            "value": "true",
            "if": "ctx.foo != null amp;amp; ctx.foo =~ /foo/"
         }
      },
      {
         "set": {
            "field": "bar_found",
            "value": "true",
            "if": "bar != null amp;amp; bar =~ /bar/"
         }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "foo": "foofoo"
      },
      "bar":"barbar"
    }
  ]
}
 

Желаемый результат приведен ниже:

 {
 "docs": [
   {
     "doc": {
      "_source": {
        "foo_found": "true",
        "foo": "foofoo",
        "bar_found": "true"
      },
      "bar":"barbar"
     }
   }
 ]
}
 

Конвейер не запускается.

Можно ли получить доступ к bar полю, которое находится за пределами _source объекта?

Пример будет запущен, если второй set процессор удален, как показано ниже:

 POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
         "set": {
            "field": "foo_found",
            "value": "true",
            "if": "ctx.foo != null amp;amp; ctx.foo =~ /foo/"
         }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "foo": "foofoo"
      },
      "bar":"barbar"
    }
  ]
}
 

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

1. Нет никакого смысла иметь поля за пределами _source , которые представляют ваш документ, кроме «официальных», т. е. _id _routing и _index

Ответ №1:

Согласно документации Elasticsearch, для имитации конвейера приема мы можем передавать только _id _index , _routing и/или _source в образцы документов.