elasticsearch,tire,Ruby On Rails,elasticsearch,Tire" /> elasticsearch,tire,Ruby On Rails,elasticsearch,Tire" />

Ruby on rails 每天唯一Mac地址的Elasticsearch日期直方图

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 => { ... }

我正在使用Elasticsearch(带Tire),需要创建一个facet,它可以输出每天、每周、每月唯一mac地址的统计信息。我在让它正常工作方面遇到了问题

我需要的是平均值和总数字,但无法使用日期直方图方面:

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电脑进行分组和排序?

在分布式环境中计算唯一值很困难。为了获得完全准确的计数,您需要对每个节点上的所有唯一值进行计数,然后将所有这些计数合并到一个节点上的单个列表中

对于基数较低的字段,这种方法可以很好地工作,但基数较高的字段最终将使用大量内存,并且很可能会失败

有两个选项可用,但您必须在速度和精度之间进行选择。您可以:

  • 使用map reduce获得缓慢精确的计数
  • 使用Elasticsearch获得快速估计计数
  • 估算方法使用估算集合中有多少唯一项的方法

    有了Elasticsearch 1.0中提供的新聚合框架,计划通过
    基数
    聚合来支持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"} }
                     }
                        }
                   }
    }