Я начал экспериментировать с приемными конвейерами и процессорами Elasticsearch как возможно более быстрым способом построения того, что я могу описать как «инвертированный индекс».
Вот что я пытаюсь сделать: у меня есть документы индекс. Каждый документ похож на следующее:
{
"id": "DOC1",
"title": "Quiz no. 1",
"questions": [
{
"question": "Who was the first person to walk on the Moon?",
"choices": [
{ "answer": "Michael Jackson", "correct": false },
{ "answer": "Neil Armstrong", "correct": true }
]
},
{
"question": "Who wrote the Macbeth?",
"choices": [
{ "answer": "William Shakespeare", "correct": true },
{ "answer": "Dante Alighieri", "correct": false },
{ "answer": "Arthur Conan Doyle", "correct": false }
]
}
]
}
Я пытаюсь понять, существует ли волшебная c комбинация переиндексации, конвейеров и процессоров, которая может позволить мне автоматически создавать вопросы * Индекс 1007 *. Вот пример того, как будет выглядеть этот индекс:
[
{
"question_id": "<randomly-generated-value-1>",
"document_id": "DOC1",
"question": "Who was the first person to walk on the Moon?",
"choices": [
{ "answer": "Michael Jackson", "correct": false },
{ "answer": "Neil Armstrong", "correct": true }
]
},
{
"question_id": "<randomly-generated-value-2>",
"document_id": "DOC1",
"question": "Who wrote the Macbeth?",
"choices": [
{ "answer": "William Shakespeare", "correct": true },
{ "answer": "Dante Alighieri", "correct": false },
{ "answer": "Arthur Conan Doyle", "correct": false }
]
}
]
В документации Elasticsearch упоминается, что вы можете выполнить REINDEX , используя указанный c конвейер. Просматривая симуляцию конвейерной документации , я пробую несколько процессоров, в том числе foreach , но я не могу понять, являются ли итоговые документы из конвейера 1: 1 к исходному индексу или 1 исходному документу можно сгенерировать несколько целевых документов (это то, что мне нужно).
Вот смоделированный конвейер, который я пытаюсь:
{
"pipeline": {
"description": "Inverts the documents index into a questions index",
"processors": [
{
"rename": {
"field": "id",
"target_field": "document_id",
"ignore_missing": false
}
},
{
"foreach": {
"field": "questions",
"processor": {
"rename": {
"field": "_ingest._value.question",
"target_field": "question"
}
}
}
},
{
"foreach": {
"field": "questions",
"processor": {
"rename": {
"field": "_ingest._value.choices",
"target_field": "choices"
}
}
}
},
{
"remove": {
"field": "questions"
}
}
]
}
}
Это почти работает. Проблема с этим подходом состоит в том, что есть только один итоговый документ, который соответствует первому вопросу. Второй вопрос отсутствует в выводе смоделированного конвейера, поэтому я сомневаюсь, что конвейер процессоров может выводить несколько целевых документов, читающих 1 исходный документ, или мы вынуждены поддерживать соотношение 1: 1.