#elasticsearch
Вопрос:
У меня есть турнирная таблица WRC в моем индексе ES. У каждого водителя есть свой собственный документ.
Сопоставление для этого индекса:
`{
"properties" : {
"Argentina pts" : {
"type" : "long"
},
"Argentina result" : {
"type" : "long"
},
"Chile pts" : {
"type" : "long"
},
"Chile result" : {
"type" : "long"
},
"Driver" : {
"type" : "keyword"
}
"Nationality" : {
"type" : "keyword"
}
"Team" : {
"type" : "keyword"
},
"Total" : {
"type" : "long"
},
"Position" : {
"type" : "long"
}`
Пример документа:
"_source" : {
"Argentina pts" : 30,
"Argentina result" : 1,
"Chile pts" : 30,
"Chile result" : 1,
"Driver" : "O. TANAK",
"Nationality" : "Estonia",
"Team" : "Toyota",
"Total" : 263,
"Position" : 1,
}
Вопрос
Как подсчитать выигрыши водителей в зависимости от result
полей? Я пробовал разные запросы и/или агрегации, но самый близкий результат, который я получил, — это водители, по крайней мере, с одной победой в сезоне ( я использовал multi_match
для этого). Я не нашел ответа в документации Stack или Elastic. Я не знаю, как искать документы «вертикально» по нескольким полям и создавать агрегации по выбранным полям.
Редактировать
Я хочу, чтобы для каждого драйвера учитывались только result
поля, равные 1. Так, например, если водитель выиграл в Монако ( Monaco result
=1), запрос/скрипт увеличит его счетчик выигрышей.
Пример ответа
{
"Driver" : "a",
"Win count": 3
},
{
"Driver" : "b",
"Win count": 2
},
{
"Driver" : "c",
"Win count": 1
}
Комментарии:
1. Можете ли вы привести мне пример того, чего вы хотите? просто для ясности.
2. @nimeresam добавил пример
3. Что классифицируется как победа? просто
position
поле, равное 1? или вам нужно иметьChile result
=1, еслиNationality
=»Чили»?4. @RonSerruya извините, что я должен упомянуть об этом. Ваш смысл верен. Выигрыш, например
Chile result
, равен = 1 и больше ничего.
Ответ №1:
Таким образом, учитывая определение «выигрыша», заключающееся в том, что <Driver nationality> result
== 1, вы можете использовать этот запрос
{
"query": {
"script": {
"script": "def nat = doc['Nationality'].value; return doc[nat ' result'].value == 1"
}
}
}