Можно ли ускорить агрегацию эластичного поиска, если мне нужны только первые 10 ведер? - PullRequest
1 голос
/ 27 апреля 2020

Я понимаю, что запросы на агрегирование эластичного поиска занимают много времени по своей природе, особенно в полях с большим количеством элементов. В нашем случае нам нужно вернуть только первые x блоков, отсортированных по алфавиту. Учитывая, что нам нужно вернуть только 10 сегментов, есть ли способ сделать наш запрос быстрее? Есть ли способ заставить Elasticsearch посмотреть только первые 10 групп в каждом шарде и сравнить только эти?

Вот мой запрос ...

{
    "size": "600",
    "timeout": "60s",
    "query": {
        "bool": {
            "must": [
                {
                    "match_all": {
                        "boost": 1
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    },
    "aggregations": {
        "firstname": {
            "terms": {
                "field": "firstname.keyword",
                "size": 10,
                "min_doc_count": 1,
                "shard_min_doc_count": 0,
                "show_term_doc_count_error": false,
                "order": {
                    "_key": "asc"
                },
                "include": ".*.*",
                "exclude": ""
            }
        }
}
}

Я думаю, что я нахожусь на к чему-то, используя вместо этого составное агрегирование. Вот так ...

"home_address1": {
    "composite": {
        "size": 10,
        "sources": [
            {
                "home_address1": {
                    "terms": {
                        "field": "home_address1.keyword",
                        "order": "asc"
                    }
                }
            }
        ]
    }
}

Тестирование в Postman показывает, что этот запрос выполняется быстрее. Это ожидается? Если так, круто. Как добавить атрибуты include, exclude в составной запрос? Например, иногда я хочу включить только сегменты, значение которых совпадает с "A. *"

Если этот запрос не должен выполняться быстрее, то почему он выглядит так?

1 Ответ

0 голосов
/ 27 апреля 2020

Составные термины aggs, к сожалению, не поддерживают параметры include, exclude и многие другие стандартные термины aggs, поэтому у вас есть 2 варианта:

  1. Отфильтровать документы, которые не не соответствует вашему префиксу из запроса, как @ Val указал .

или

используйте скрипт, чтобы выполнить фильтрацию за вас. Это должно быть вашим последним средством: скрипты гарантированно будут работать медленнее, чем стандартные фильтры запросов.
{
  "size": 0,
  "aggs": {
    "home_address1": {
      "composite": {
        "size": 10,
        "sources": [
          {
            "home_address1": {
              "terms": {
                "order": "asc",
                "script": {
                  "source": """
                    def val = doc['home_address1.keyword'].value;
                    if (val == null) { return null; }

                    if (val.indexOf('A.') === 0) {
                      return val;
                    }

                    return null;
                  """,
                  "lang": "painless"
                }
              }
            }
          }
        ]
      }
    }
  }
}

Кстати, ваша оригинальная terms агг уже кажется оптимизированной, поэтому меня удивляет, что composite быстрее.

...