Я связываю свою службу рекомендаций с сервисом по продукту. Сервис рекомендаций, независимо от параметров, всегда возвращает список идентификаторов продуктов, отсортированных по релевантности. Пример:
["ID1", "ID2", "ID3"]
Сервисная служба владеет индексами Elasticsearch, в которых хранятся сведения о продуктах. Клиент ожидает данные о рекомендуемых продуктах вместе с деталями продукта, упорядоченными по релевантности. Следовательно, я использую этот поисковый запрос:
{
"query":{
"bool":{
"filter":[
{
"terms": {
"product_id": ["ID1", "ID2", "ID3"]
}
}
]
}
}
}
Проблема в том, что результат этого запроса не отсортирован по порядку значений терминов. Какие изменения я могу внести для достижения целей?
P.S .: Любые советы или ссылки по дизайну индекса Elasticsearch, формату ответа сервисов или дизайну системы для системы рекомендаций будут очень приветствоваться.
Основа определяется ML в сервисе рекомендаций, может быть основана на аналогичном продукте или даже на времени суток. Товарная служба (индексы ES) не должна знать об основе сортировки.
Запрос 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
по какому принципу вы хотите сортировать результат?