#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
в образцы документов.