我正在使用Elasticsearch(使用Tire)并需要创建一个facet,它输出每天,每周,每月每日唯一mac地址的统计信息。我一直遇到问题,让它正常工作。
我需要表示总数并且无法使用date_histogram facet
def self.search_stats params
tire.search(page: params[:page], per_page: 50) do |s|
filter = []
filter << { :terms => { ... }}
s.facet('uniques') do
date :created_at, :interval => 'day', value_field: 'mac.sortable'
facet_filter :and, filter
end
end
end
这给出了一个错误:“无法解析源代码......”
最后,我一直在尝试使用脚本来完成它,但这并没有真正解决,因为我无法弄清楚如何对值进行分组。
我一直在使用:
date :created_at, value_script: "doc['mac.sortable'].values.size()", interval: 'day'
Obvs。 size()是错误的,因为我需要唯一的值。
我的映射如下所示:
mapping do
...
indexes :mac, type: 'multi_field', fields: {
raw: {type: 'string', index: 'analyzed'},
sortable: {type: 'string', index: :not_analyzed}
}
...
end
由于内存使用警告,我根本不想使用脚本字段。
如何让我的mac每天分组和排序?
答案 0 :(得分:2)
难以在分布式环境中计算唯一值。为了获得完全准确的计数,您需要计算每个节点上的所有唯一值,然后将所有这些计数合并到一个节点上的单个列表中。
对于基数较低的字段,此方法可以正常工作,但具有高基数的字段最终会占用大量内存,并且很可能会失败。
有两种选择,但您必须在速度和准确度之间进行选择。你可以:
估算方法使用HyperLogLog algorithm (PDF)来估算集合中有多少唯一项目。
使用Elasticsearch 1.0中提供的新聚合框架,计划通过cardinality
聚合支持HLL。目前,代码不在主存储库中,但可以在https://github.com/jpountz/elasticsearch/tree/feature/term_count_aggregations
HyperLogLog facet可用作Elasticsearch的插件,但尚未针对最新版本进行更新。还有这个新发布的cardinality plugin使用HLL。我没有使用任何一个插件,所以不能保证它们,但这些看起来是你唯一的选择,直到将对HLL的官方支持添加到Elasticsearch。
答案 1 :(得分:1)
您可以阅读:http://www.elasticsearch.org/blog/count-elasticsearch/
POST /access/search/_search
{
"size" : 0,
"aggs" : {
"daily" : {
"date_histogram" : {"field":"date", "interval" : "day"},
"aggs" :
{
"query_count" : {"cardinality" : {"field" : "q"} }
}
}
}
}