1

我们对使用高基数索引感兴趣。(众所周知,这对 Elastic Search 来说是个问题)

我们已经从您那里得知,对于

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 中使用?

4

2 回答 2

4

在 crate 中,这个特性作为一个额外的聚合函数在我们的 backlog 中,它使用了 hyperlog 算法。我们计划进行从 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中所述的高基数字段对表进行聚类

于 2014-03-24T10:31:35.530 回答
2

计划在 1.1.0 中使用 HyperLogLog 进行高基数计数,文档已经完成:http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html

例子:

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

至于像UDF这样的东西,您可以使用脚本,例如通过将过滤器聚合脚本过滤器结合起来

{
    "aggs": {
        "in_stock_products": {
            "filter": {
                "script": {
                    "script": "doc['price'].value > minPrice"
                    "params": {
                        "minPrice": 5
                    }
                }
            },
            "aggs": {
                "avg_price": {
                    "avg": {
                        "field": "price"
                    }
                }
            }
        }
    }
}
于 2014-03-24T07:13:56.900 回答