Объедините rescore и сортируйте в одном запросе Elasticsearch - PullRequest
0 голосов
/ 19 февраля 2019

Проблема

Что такое хороший альтернативный запрос, если мне нужны как rescore, так и сортировка?Я знаю, что объединение обоих не поддерживается (запрос rescore не выполняется с версией Elasticsearch 5.4, которую я использую, и в документации говорится, что она вызывает исключение с Elasticsearch 6.x), но я не могу придумать ни одного запроса, которыйподошел бы к ожидаемому поведению.

Пример

Допустим, документы в моем индексе представляют книги с полями title, description и genre.Я хотел бы иметь основной запрос для сопоставления в поле title, затем повторный запрос для сопоставления в поле description только для 500 лучших документов и, наконец, сортировку, которая включает оба поля genre (дляотсортировать результаты на основе пользовательского упорядочения различных значений жанра) и оценки, полученной в результате пересчета.

Сначала я попытался использовать следующий запрос:

{
  "query": {
    "match": {
      "title": "birds"
    }
  },
  "rescore": {
    "query": {
      "query_weight": 1.0,
      "rescore_query": {
        "match": {
          "description": "colorful"
        }
      },
      "rescore_query_weight": 1.0
    },
    "window_size": 500
  },
  "sort": [
    {
      "_script": {
        "order": "asc",
        "script": {
          "params": {
            "Fantasy": 0,
            "Thriller": 1,
            "Detective": 2
          },
          "source": "params[doc['genre.keyword'].value]"
        },
        "type": "number"
      }
    },
    {
      "_score": "desc"
    }
  ]
}

Неудовлетворительный обходной путь

Поскольку rescore и sort не совместимы, я в итоге использовал три разных запроса только для rescore, по одному для каждого жанра (Fantasy, Thriller и Detective) и объединяя результаты в ожидаемом порядке.Но у этого решения есть несколько недостатков:

  • это занимает больше времени, так как я отправляю несколько запросов в Elasticsearch
  • труднее использовать возможности Elasticsearch для разбиения на страницы результатов
  • для этого требуется код вне Elasticsearch

В моем случае из реальной жизни я не хочу переносить содержимое запроса rescore в основной запрос и использовать только сортировку, потому что мой основной запрос возвращает многодокументы и запрос на восстановление занимают слишком много времени для подсчета баллов по каждому возвращенному документу ...

Заранее благодарим вас за любые советы о том, как справиться с одновременным восстановлением и сортировкой!

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