#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