Ruby on rails 每天唯一Mac地址的Elasticsearch日期直方图
我正在使用Elasticsearch(带Tire),需要创建一个facet,它可以输出每天、每周、每月唯一mac地址的统计信息。我在让它正常工作方面遇到了问题 我需要的是平均值和总数字,但无法使用日期直方图方面:Ruby on rails 每天唯一Mac地址的Elasticsearch日期直方图,ruby-on-rails,
elasticsearch,tire,Ruby On Rails,
elasticsearch,Tire,我正在使用Elasticsearch(带Tire),需要创建一个facet,它可以输出每天、每周、每月唯一mac地址的统计信息。我在让它正常工作方面遇到了问题 我需要的是平均值和总数字,但无法使用日期直方图方面: def self.search_stats params tire.search(page: params[:page], per_page: 50) do |s| filter = [] filter << { :terms => { ... }
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
OBV。size()错误,因为我需要唯一的值
我的映射如下所示:
mapping do
...
indexes :mac, type: 'multi_field', fields: {
raw: {type: 'string', index: 'analyzed'},
sortable: {type: 'string', index: :not_analyzed}
}
...
end
由于内存使用警告,我根本不想使用脚本字段
如何每天对Mac电脑进行分组和排序?在分布式环境中计算唯一值很困难。为了获得完全准确的计数,您需要对每个节点上的所有唯一值进行计数,然后将所有这些计数合并到一个节点上的单个列表中 对于基数较低的字段,这种方法可以很好地工作,但基数较高的字段最终将使用大量内存,并且很可能会失败 有两个选项可用,但您必须在速度和精度之间进行选择。您可以:
基数
聚合来支持HLL。当前代码不在主存储库中,但可以在以下位置看到:
A作为Elasticsearch的插件提供,但尚未针对最新版本进行更新。还有一个新发布的版本使用HLL。我没有使用过这两个插件,因此无法为它们提供担保,但在Elasticsearch中添加对HLL的官方支持之前,这些插件似乎是您唯一的选择。您可以阅读:
嗯,在某些方面,我很高兴它实际上比预期的更复杂——我想知道为什么我发现它如此棘手。我们需要准确性和速度,因为它有一个账单点。有趣的是,今天启动一个hadoop集群,看看我们能从中得到什么。然而,我宁愿只依赖于一个简单的例子。我运行的是0.95,但它似乎与这两个插件都不兼容。谢谢你的建议。现在两个都用吧。我们设法用MySQL完成了第一个查询,并在适当的COL之间建立了一些方便的索引。查询时间也与ES相同。很好地正确使用MySQL,而不是依赖花哨的新工具;)话虽如此,我们必须使用aggs来处理5000万行的查询……是的,依靠可靠的技术通常更好。如果您并行执行所有“子ES查询”,则可以更快(但我猜ES与mysql^^相比具有强大的多线程管理)。顺便说一句,这个新的聚合器框架真的很酷!
mapping do
...
indexes :mac, type: 'multi_field', fields: {
raw: {type: 'string', index: 'analyzed'},
sortable: {type: 'string', index: :not_analyzed}
}
...
end
POST /access/search/_search
{
"size" : 0,
"aggs" : {
"daily" : {
"date_histogram" : {"field":"date", "interval" : "day"},
"aggs" :
{
"query_count" : {"cardinality" : {"field" : "q"} }
}
}
}
}