Elasticsearch - Агрегации по части запроса bool
Скажем, у меня есть этот запрос bool:
"bool" : {
"should" : [
{ "term" : { "FirstName" : "Sandra" } },
{ "term" : { "LastName" : "Jones" } }
],
"minimum_should_match" : 1
}
это значит, что я хочу сопоставить всех людей с именем Сандра ИЛИ фамилия Джонс.
Теперь, есть ли способ получить агрегацию для всех документов, которые соответствуют только первый термин?
Например, я хочу получить все уникальные значения "Призов", которыми обладает любой человек по имени Сандра. Обычно я бы просто сделал:
"query": {
"match": {
"FirstName": "Sandra"
}
},
"aggs": {
"Prizes": {
"terms": {
"field": "Prizes"
}
}
}
Есть ли способ объединить эти два, так что мне нужно только выполнить один запрос, который возвращает всех людей с именем Сандра или фамилию Джонс, И агрегацию только на людей с именем Сандра?
Большое спасибо!
1 ответ
Используйте post_filter. Пожалуйста, обратитесь к следующему запросу. Post_filter позаботится о том, чтобы условие bool from не влияло на объем агрегации.
Агрегации также фильтруются по основному запросу, но post_filter на них не влияет. Пожалуйста, обратитесь к ссылке
{
"from": 0,
"size": 20,
"aggs": {
"filtered_lastname": {
"filter": {
"query": {
"match": {
"FirstName": "sandra"
}
}
},
"aggs": {
"prizes": {
"terms": {
"field": "Prizes",
"size": 10
}
}
}
}
},
"post_filter": {
"bool": {
"should": [{
"term": {
"FirstName": "Sandra"
}
}, {
"term": {
"LastName": "Jones"
}
}],
"minimum_should_match": 1
}
}
}
Запуск фильтра внутри агг перед тем, как собирать призы, поможет вам достичь желаемого варианта использования.
Спасибо надеюсь это поможет