Здесь нас интересует работа с индексами высокой мощности. (Что, как известно, является проблемой для эластичного поиска)
Мы уже знаем от вас, что для
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-плагины?
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
Подсчет высокой мощности с 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 путем объединения агрегации фильтров a> с фильтром сценария
{
"aggs": {
"in_stock_products": {
"filter": {
"script": {
"script": "doc['price'].value > minPrice"
"params": {
"minPrice": 5
}
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
Похожие вопросы
Новые вопросы
elasticsearch
Elasticsearch - это бесплатная и открытая, распределенная, спокойная поисковая система на основе Lucene.