2015-05-13 38 views
0

我試圖通過elasticsearch,多個字段來做一個組。我知道存在嵌套聚合,但我想要的是在某個存儲桶中包含我分組的字段爲空的記錄。多組by by elasticsearch包括缺失值

說,我們有這樣的數據結構:

SONG_ID | SONG_GENRE | SONG_ARTIST 

和我通過genere,藝術家想組。 我想爲每個可能的組合,即

組按類型給我5桶(如果流派是5)加上有沒有流派的歌曲的桶。由藝術家分組給我,爲每個流派,藝術家加上一個沒有藝術家的歌曲桶。

基本上,我想要得到和使用組相同的結果。這甚至有可能嗎?

+0

您需要將您的表格與其他主表格連接起來。那麼你需要使用group by –

+0

在elasticsearch中使用group?你明白我在說什麼嗎? –

回答

0

您可以通過不同方式解決您的需求。

最簡單的方法是,如果類型不存在,則將指定「未提及」的修復值與songsgenre字段進行索引。您可以在建立索引時或在字段映射中定義「null_value」。

"SONG_GENRE": {"type": "string", "null_value": "notmentioned"}, 
"SONG_ARTIST": {"type": "string", "null_value": "notmentioned"}, 

因此,在聚合(嵌套)期間,您將自動找到針對沒有流派的歌曲的「未提及」計數。

另一種方法是使用缺少的過濾器作爲另一個聚合以及正常聚合。像下面的東西。

{ 
    "aggs": { 
     "SONG_GENRE": { 
      "terms": { 
       "field": "SONG_GENRE" 
      }, 
      "aggs": { 
       "SONG_ARTIST": { 
        "terms": { 
         "field": "SONG_ARTIST" 
        } 
       }, 
       "MISSING_SONG_ARTIST": { 
        "filter": { 
         "missing": { 
          "field": "SONG_ARTIST" 
         } 
        } 
       } 
      } 
     }, 
     "MISSING_SONG_GENRE": { 
      "filter": { 
       "missing": { 
        "field": "SONG_GENRE" 
       } 
      }, 
      "aggs": { 
       "MISSING_SONG_GENRE_SONG_ARTIST": { 
        "terms": { 
         "field": "SONG_ARTIST" 
        } 
       }, 
       "MISSING_SONG_GENRE_MISSING_SONG_ARTIST": { 
        "filter": { 
         "missing": { 
          "field": "SONG_ARTIST" 
         } 
        } 
       } 
      } 
     } 
    } 
} 

我還沒有驗證語法。這只是給你一個想法

另一種黑客方式可能是將缺少的計數(總點擊數 - 所有聚合計數)作爲不計類型的計數。

+0

感謝Prabin。在問這裏之前,我試過了你提出的同樣的解決方案,但這是不可行的,因爲我的「團隊」在20多個領域。我意識到如果你使用elasticsearch,你無法獲得與你在sql上相同的東西。但是,對於migth感興趣的人,我的解決方法是在表格上創建一個新的字段,其中包含我必須完成的20個字段的散列。這樣,不同的哈希將代表不同的組,並且您可以在elasticsearch中通過該字段進行正常聚合。 –