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

#elasticsearch #microservices #software-design

#эластичный поиск #микросервисы #разработка программного обеспечения

Вопрос:

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

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

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

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

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

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

Комментарии:

1. на каком основании вы хотите , чтобы результат был отсортирован ?

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

Ответ №1:

terms Запрос функционирует как OR фильтр, который оценивает совпадения способом bool ( 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"]
          }
        }
      ]
    }
  }
}
 

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

Комментарии:

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