как индексировать вопросы и ответы в elaticsearch

Я делаю проект по индексации вопросов и ответов веб-сайта в elasticsearch (версия 6) для целей поиска.

Сначала я подумал о создании двух индексов, как показано ниже, один для вопросов и один для ответов.

сопоставление вопросов:

{"mappings": {
"question": {
  "properties": {
    "title":{
        "type":"text"
    },
    "question": {
      "type":  "text"
    },
    "questionId":{
        "type":"keyword"
    }
  }
}
}
}

сопоставление ответов:

{"mappings": {
    "answer": {
      "properties": {
        "answer":{
            "type":"text"
        },
        "answerId": {
          "type":  "keyword"
        },
        "questionId":{
            "type":"keyword"
        }
      }
    }
  }
}

Я использовал запрос с множественным соответствием вместе с агрегацией терминов и top_hits для поиска индексированных вопросов и ответов (упомянутый вопрос). Я использовал этот метод, чтобы удалить дубликаты из результатов поиска. Как ответы или сам вопрос одного и того же вопроса может появиться в результате. Мне нужна только одна запись на вопрос в результатах. проблема, с которой я сталкиваюсь, состоит в том, чтобы разбить результаты на страницы. нет возможности разбить агрегацию на страницы в elasticsearch. Он может разбивать на страницы только хиты, а не агрегации.

затем я подумал о том, чтобы сохранить и вопрос, и ответы в одном документе, ответы в массиве Json. проблема с этим подходом заключается в том, что нет простого способа добавить, удалить, обновить конкретный ответ в заданном документе вопроса. единственный способ, который я нашел, - это использовать отличный скрипт (ссылочный вопрос). который устарел в elasticsearch v6 AFAIK.

Есть ли лучший и чистый способ спроектировать это? Спасибо.


person Bhanuka Yd    schedule 20.06.2018    source источник
comment
Можете ли вы уточнить, почему появляются повторяющиеся результаты поиска, было бы полезно, если бы вы могли поделиться своим запросом на ES.   -  person Sunder R    schedule 25.06.2018
comment
повторяющиеся результаты возникают, когда несколько ответов или сам вопрос сопоставляются с запросом, который, в конечном итоге, указывает на один и тот же вопрос.   -  person Bhanuka Yd    schedule 26.06.2018
comment
Если вы будете использовать отношение родитель-потомок, это также решит вашу проблему дублирования, так как вы будете запрашивать или агрегировать, используя has_child или has_parent   -  person Sunder R    schedule 26.06.2018


Ответы (1)


Отношения между родителями и детьми

Используйте отношения родитель-потомок. Она похожа на вложенную модель и позволяет ассоциировать один объект с другим. Вы можете связать один тип документа с другим в отношении «один ко многим». Дополнительная информация здесь: https://www.elastic.co/guide/en/elasticsearch/guide/current/parent-child.html

Дочерние документы можно добавлять, изменять или удалять, не затрагивая родительский или другие дочерние документы. Вы можете разбивать родительские документы на страницы с помощью Scroll API. Дочерние документы можно получить с помощью соединения has_parent.

Компромисс: вам не нужно заботиться о дубликатах и ​​проблемах с нумерацией страниц, но запросы «родитель-потомок» могут выполняться в 5–10 раз медленнее, чем эквивалентный вложенный запрос.

Ваше сопоставление может выглядеть следующим образом:

PUT /my-index
{
  "mappings": {
    "question": {
      "properties": {
        "title": {
          "type": "text"
        },
        "question": {
          "type": "text"
        },
        "questionId": {
          "type": "keyword"
        }
      }
    },
    "answer": {
      "_parent": {
        "type": "question"
      },
      "properties": {
        "answer": {
          "type": "text"
        },
        "answerId": {
          "type": "keyword"
        },
        "questionId": {
          "type": "keyword"
        }
      }
    }
  }
}
person Sunder R    schedule 25.06.2018