每天唯一Mac地址的弹性搜索日期直方图

时间:2014-03-03 14:02:24

标签: ruby-on-rails elasticsearch tire

我正在使用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每天分组和排序?

2 个答案:

答案 0 :(得分:2)

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

对于基数较低的字段,此方法可以正常工作,但具有高基数的字段最终会占用大量内存,并且很可能会失败。

有两种选择,但您必须在速度和准确度之间进行选择。你可以:

  1. 使用map-reduce
  2. 获取慢速准确计数
  3. 使用Elasticsearch
  4. 获取快速估算的计数

    估算方法使用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"} }
                 }
                    }
               }
}