Elasticsearch сортирует по порядку значений терминов

Я связываю свою службу рекомендаций с сервисом по продукту. Сервис рекомендаций, независимо от параметров, всегда возвращает список идентификаторов продуктов, отсортированных по релевантности. Пример:

["ID1", "ID2", "ID3"]

Сервисная служба владеет индексами Elasticsearch, в которых хранятся сведения о продуктах. Клиент ожидает данные о рекомендуемых продуктах вместе с деталями продукта, упорядоченными по релевантности. Следовательно, я использую этот поисковый запрос:

{
  "query":{
    "bool":{
      "filter":[
        {
          "terms": {
            "product_id": ["ID1", "ID2", "ID3"]
          }
        }
      ]
    }
  }
}

Проблема в том, что результат этого запроса не отсортирован по порядку значений терминов. Какие изменения я могу внести для достижения целей?

P.S .: Любые советы или ссылки по дизайну индекса Elasticsearch, формату ответа сервисов или дизайну системы для системы рекомендаций будут очень приветствоваться.

по какому принципу вы хотите сортировать результат?

ESCoder 31.03.2021 03:20

Основа определяется ML в сервисе рекомендаций, может быть основана на аналогичном продукте или даже на времени суток. Товарная служба (индексы ES) не должна знать об основе сортировки.

angguak 31.03.2021 07:02
0
2
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Запрос terms функционирует как фильтр OR, который оценивает совпадения логическим способом (true -> 1, false -> 0).

Сказав это, вы можете сгенерировать аналогичный запрос OR через запрос query_string, который будет повысить индивидуальные идентификаторы, тем самым увеличив их оценку и, следовательно, отсортируя их выше:

{
  "query":{
    "bool":{
      "should": [
        {
          "query_string": {
            "default_field": "product_id",
            "query": "ID1^3 OR ID2^2 OR ID3^1"
          }
        }
      ], 
      "filter":[
        {
          "terms": {
            "product_id": ["ID1", "ID2", "ID3"]
          }
        }
      ]
    }
  }
}

Приведенные выше значения ускорения, конечно, можно динамически изменять, чтобы учесть изменяющуюся длину списка идентификаторов.

Я также обнаружил, что, чтобы избежать условий фильтрации, помимо query_string, я могу применить min_score: 0.1

angguak 31.03.2021 14:15

Другие вопросы по теме