【问题标题】:Elasticsearch Date Histogram for Unique Mac Address per day每天唯一 Mac 地址的 Elasticsearch 日期直方图
【发布时间】:2014-05-29 23:12:27
【问题描述】:

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

我需要平均数字和总数字,但无法使用 date_histogram 方面:

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'

观察。 size() 是错误的,因为我需要唯一值。

我的映射如下所示:

mapping do
  ...
  indexes :mac, type: 'multi_field', fields: {
    raw: {type: 'string', index: 'analyzed'},
    sortable: {type: 'string', index: :not_analyzed}
  }
  ...
end

由于内存使用警告,我根本不想使用脚本字段。

如何每天对我的 Mac 进行分组和排序?

【问题讨论】:

    标签: ruby-on-rails elasticsearch tire


    【解决方案1】:

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

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

    有两种选择,但您必须在速度和准确性之间做出选择。您可以:

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

    估计方法使用HyperLogLog algorithm (PDF),它估计一个集合中有多少独特的项目。

    借助 Elasticsearch 1.0 中提供的新聚合框架,计划通过 cardinality 聚合支持 HLL。目前代码不在主存储库中,但可以在以下位置看到:https://github.com/jpountz/elasticsearch/tree/feature/term_count_aggregations

    HyperLogLog facet 可作为 Elasticsearch 的插件使用,但尚未针对最新版本进行更新。还有这个新发布的cardinality plugin,它使用了 HLL。我没有使用过任何一个插件,所以不能保证它们,但在 Elasticsearch 中添加对 HLL 的官方支持之前,这些看起来是你唯一的选择。

    【讨论】:

    • 嗯,在某些方面我很高兴它实际上比预期的更复杂 - 想知道为什么我发现它如此棘手。我们将需要准确性和速度,因为它有一个账单点。今天有趣地启动了一个 hadoop 集群,看看我们能从中得到什么。但是,我宁愿只依赖 ES。我正在运行 0.95,但它似乎与任何一个插件都不兼容。感谢您的建议。
    【解决方案2】:

    您可以阅读: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"} }
                     }
                        }
                   }
    }
    

    【讨论】:

    • 现在两者都用。我们设法使用 MySQL 完成了第一个查询,并在适当的列上进行了一些方便的索引。查询时间与 ES 也没有什么不同。很好地正确使用 MySQL 而不是依赖花哨的新工具 ;) 话虽如此,我们不得不使用 aggs 来进行 5000 万行的查询...
    • 是的,依靠可靠的技术通常会更好。如果您并行执行所有“子 ES 查询”,可以更快(但我猜 ES 具有强大的多线程管理,与 mysql ^^ 相比)。顺便说一句,这个新的聚合器框架真的很酷!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多