Лучшая практика для создания настраиваемого сопоставления в агрегации Elasticsearch

Я хочу выполнить индивидуальную агрегацию путем сопоставления определенного поля в документе ES.

Я стараюсь использовать сценарий агрегирования терминов . Существуют сотни сопоставлений, поэтому я должен поместить их все в HashMap:

      GET /myindex/_search
{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "myagg": {
            "terms": {
                "script": {
                    "source": "Map m = new HashMap(); m.put('a', 'A'); m.put('b', 'A'); m.put('bb', 'CC'); ... return m.get(doc['foo.keyword'].value)",
                    "lang": "painless"
                }
            }
        }
    },
    "size": 0
}

Это уродливо, и производительность настолько плохая, хотя я использую сохраненный скрипт. Понятия не имею, почему в моем сценарии выполнение занимает так много времени.

Я также пробовал агрегировать метрики по сценарию . Это лучше, но все же медленнее по сравнению с обычным агрегированием терминов.

Есть ли способ ускорить отображение? (кроме полей времени выполнения, поскольку моя версия ES не поддерживает его)

1 ответ

tldr, вы можете попробовать поля времени выполнения, если они у вас есть, но есть вероятность, что они также не будут быстрыми. это неудачная природа сценариев в Elasticsearch на данный момент

лучше всего будет то, что ExplodZe говорит выше, и проделайте эту работу до процесса загрузки, чтобы ускорить время запроса

Другие вопросы по тегам