Группа Elasticsearch по агрегации с эффективностью фильтрации - PullRequest
0 голосов
/ 21 июня 2019

У меня проблема с производительностью Elasticsearch (6.3). В моем индексе есть документы 1B, и мне нужно выполнить агрегирование по небольшому подмножеству данных.

Мой индекс выглядит как

    "s-data": {
        "mappings": {
            "s-type": {
                "properties": {
                    "c": {
                        "type": "integer"
                    },
                    "r": {
                        "type": "keyword"
                    },
                    "s": {
                        "type": "integer"
                    },
                    "t": {
                        "type": "keyword"
                    }
                }
            }
        }
    }
}

и мой запрос выглядит как

{
    "query":{
        "bool":{
            "filter":[
                {"term":{"t": "foo"}},
                {"term":{"c": 1}},
                {"terms":{"r": ["foobar", "foobaz"]}},
                {"term":{"s": 3}}
            ]
        }
    },
    "aggs":{
        "recips":{
          "terms": {"field": "r"}
        }
    }
}

Сам запрос выполняется за 15 мс, но как только я добавлю агрегацию, все закончится. Я предполагаю, что агрегация выполняется для всего набора данных 1B doc. Как я могу сделать агрегацию только по результатам моего запроса?

1 Ответ

0 голосов
/ 21 июня 2019

Вы можете попробовать фильтр агрегации :

{
    "aggs":{
        "recips_subset": {
           "filter":[
                {"term":{"t": "foo"}},
                {"term":{"c": 1}},
                {"terms":{"r": ["foobar", "foobaz"]}},
                {"term":{"s": 3}}
            ],
            "aggs": {
                "recips":{
                    "terms": {"field": "r"}
                }
            }
        }
    }
}

Однако , это должно иметь тот же эффект, что и ваш исходный запрос, так как агрегаты выполняются в контекстевыполненный запрос / фильтры поискового запроса.Таким образом, чтобы найти реальное узкое место, нужна дополнительная информация:

  • Что такое кардинальность поля r?
  • Изменили ли вы sizeпараметр или вы использовали сценарий вместо поля?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...