Здесь нас интересует работа с индексами высокой мощности. (Что, как известно, является проблемой для эластичного поиска)

Мы уже знаем от вас, что для

select count(distinct high_cardinality_field) from my_table

У вас уже есть некоторые оптимизации, чтобы посчитать это. Можно ли когда-нибудь написать что-нибудь вроде:

select count_via_hyperloglog(high_cardinality_field) from my_table

Имея count_via_hyperloglog как UDF или что-то в этом роде, как это возможно прямо сейчас в ES через ES-плагины?

1
Vlad Vlaskin 24 Мар 2014 в 10:07

2 ответа

Лучший ответ

В ящике эта функция находится в нашем бэклоге как дополнительная функция агрегирования, которая использует алгоритм гиперлога. мы планируем использовать именование на основе presto http://prestodb.io/docs/current/ functions / aggregate.html. Ваш пример, вероятно, будет выглядеть так:

select approx_distinct(high_cardinality_field) from my_table

Однако возможное улучшение производительности для одного конкретного поля в таблице - это кластеризация вашей таблицы на основе поля высокой мощности, как описано в разделе https://crate.io/docs/current/sql/ddl.html#routing

4
dobe 24 Мар 2014 в 14:31
Спасибо! Каково время поддержки этой функции?
 – 
Vlad Vlaskin
24 Мар 2014 в 18:18
И вообще, можно ли писать UDF?
 – 
Vlad Vlaskin
25 Мар 2014 в 14:37
Ага, трудно оценить, когда эта фича превратится в спринт, наверное, через месяц наверное
 – 
dobe
26 Мар 2014 в 13:55
В настоящее время у нас нет интерфейса плагина. Однако вклад приветствуется :) взгляните на io.crate.operation.aggregation.impl.CountAggregation в качестве примера.
 – 
dobe
26 Мар 2014 в 13:58

Подсчет высокой мощности с HyperLogLog запланирован на 1.1.0, документация уже опубликована: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html.

Примере:

{
    "aggs" : {
        "author_count" : {
            "cardinality" : {
                "field" : "author"
            }
        }
    }
}

Что касается чего-то вроде UDF, вы можете использовать скрипты , .eg путем объединения агрегации фильтров с фильтром сценария

{
    "aggs": {
        "in_stock_products": {
            "filter": {
                "script": {
                    "script": "doc['price'].value > minPrice"
                    "params": {
                        "minPrice": 5
                    }
                }
            },
            "aggs": {
                "avg_price": {
                    "avg": {
                        "field": "price"
                    }
                }
            }
        }
    }
}
2
knutwalker 24 Мар 2014 в 11:19
Спасибо, это имеет смысл. Каково предполагаемое время выпуска ES 1.1?
 – 
Vlad Vlaskin
24 Мар 2014 в 18:18
Похоже, ES 1.1.0 вышла 25 марта!
 – 
Vlad Vlaskin
26 Мар 2014 в 16:38