Elasticsearch — агрегирование части логического запроса

Скажем, у меня есть этот логический запрос:

"bool" : {
    "should" : [
        { "term" : { "FirstName" : "Sandra" } },
        { "term" : { "LastName" : "Jones" } }
     ],
     "minimum_should_match" : 1
}

это означает, что я хочу сопоставить всех людей с именем Сандра ИЛИ фамилией Джонс.

Теперь, есть ли способ, которым я могу выполнить агрегацию всех документов, которые соответствуют только первому термину?

Например, я хочу получить все уникальные значения «Призов», которые есть у кого-то по имени Сандра. Обычно я просто делаю:

"query": {
    "match": {
        "FirstName": "Sandra"
    }
},
"aggs": {
    "Prizes": {
        "terms": {
            "field": "Prizes"
        }
    }
}

Есть ли способ объединить их, чтобы мне нужно было выполнить только один запрос, который возвращает всех людей с именем Сандра или фамилией Джонс, И агрегирование только людей с именем Сандра?

Большое спасибо!


person dan martin    schedule 08.01.2017    source источник
comment
Зачем вам это нужно?   -  person Lax    schedule 08.01.2017
comment
@Lax Ну, мне нужны все люди с именем Сандра, все люди с фамилией Джонс и агрегация всех людей с именем Сандра в любом случае, поэтому мне было интересно, могу ли я объединить их в один запрос вместо двух ( все люди с именем Сандра + совокупность и все люди с фамилией Джонс). Просто желаемое за действительное, я думаю.   -  person dan martin    schedule 08.01.2017


Ответы (1)


Используйте пост_фильтр. Пожалуйста, обратитесь к следующему запросу. Post_filter позаботится о том, чтобы ваше предложение bool не повлияло на вашу область агрегирования.

Агрегации также фильтруются на основе основного запроса, но на них не влияет 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
        }
    }
}

Запуск фильтра внутри аггов перед агрегированием призов может помочь вам достичь желаемого варианта использования.

Спасибо Надеюсь это поможет

person user3775217    schedule 08.01.2017