2014-03-03 59 views
1

我使用Elasticsearch(與輪胎),並需要創建一個方面輸出每天,每週,每月的每日唯一MAC地址的統計信息。我遇到了讓它正常工作的問題。Elasticsearch日期直方圖爲每天唯一的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' 

Obvs。 size()是錯誤的,因爲我需要唯一的值。

我的映射是這樣的:

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

我真的不希望在所有使用,因爲內存使用警告的腳本場。

我怎樣才能讓我的蘋果機每天分組和排序?

回答

2

計算分佈式環境中的唯一值很困難。爲了獲得完全準確的計數,您需要計算每個節點上的所有唯一值,然後將所有這些計數合併到一個節點上的單個列表中。

對於低基數的領域,這種方法可以很好地工作,但基數高的領域將最終使用大量的內存並且很可能會失敗。

有兩種選擇可用,但您必須在速度和準確性之間進行選擇。您可以:

  1. 使用使用Elasticsearch

估計方法使用,其估計許多獨特的項目是如何在一組HyperLogLog algorithm (PDF)的map-reduce

  • 獲得快速估計數很慢準確計數。

    由於Elasticsearch 1.0提供了新的聚合框架,有計劃通過cardinality聚合支持HLL。目前代碼不在主要存儲庫中,但可以在以下位置看到:https://github.com/jpountz/elasticsearch/tree/feature/term_count_aggregations

    A HyperLogLog facet可用作Elasticsearch的插件,但尚未針對最新版本進行更新。還有這個新發布的使用HLL的cardinality plugin。我沒有使用任何一個插件,所以不能擔保他們,但這些看起來像你唯一的選擇,直到正式支持HLL被添加到Elasticsearch。

  • +0

    嗯,在某些方面,我很高興它實際上比預期的更爲複雜 - 不知道爲什麼,我發現它如此棘手。我們將需要準確性和速度,因爲它有一個法案。今天有趣地創建了一個hadoop集羣,將會看到我們能從中得到什麼。但是,我寧願依靠ES。我運行0.95,但似乎不兼容任何插件。感謝您的建議。 – simonmorley

    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"} } 
           } 
            } 
           } 
    } 
    
    +0

    立即使用兩者。我們設法使用MySQL完成第一個查詢,並在適當的列上進行一些方便的索引。查詢時間與ES不一樣。很好地正確使用MySQL,而不依賴於新奇的工具;)說了這麼多,我們不得不使用aggs來處理5000萬行的查詢...... – simonmorley

    +0

    是的,依靠固體技術通常會更好。如果你並行執行所有的「子ES查詢」,可以更快(但我猜ES與mysql ^^相比,ES具有強大的多線程管理)。順便說一句,這個新的聚合框架非常酷! –

    相關問題