Как построить инвертированный индекс поиска 1: n с использованием переиндексации, конвейера загрузки и процессоров - PullRequest
0 голосов
/ 09 марта 2020

Я начал экспериментировать с приемными конвейерами и процессорами 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.

1 Ответ

0 голосов
/ 09 марта 2020

Этот ответ , похоже, говорит о том, что я пытаюсь достичь, не возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...