2016-12-07 260 views
1

我有一個嵌套架構的映射,我打算在嵌套字段上進行聚合,並通過docid計數進行排序。Elasticsearch嵌套基數聚合

select name, count(distinct docid) as uniqueid from table 
group by name 
order by uniqueid desc 

以上是我想要做的。

{ 
    "size": 0, 
    "aggs": { 
     "samples": { 
     "nested": { 
      "path": "sample" 
     }, 
     "aggs": { 
      "sample": { 
       "terms": { 
        "field": "sample.name", 
     "order": { 
        "DocCounts": "desc" 
        } 
       }, 
       "aggs": { 
        "DocCounts": { 
        "cardinality": { 
         "field": "docid"    
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 

但結果我沒有得到預期的輸出

結果:

"buckets": [ 
       { 
        "key": "xxxxx", 
        "doc_count": 173256, 
        "DocCounts": { 
        "value": 0 
        } 
       }, 
       { 
        "key": "yyyyy", 
        "doc_count": 63, 
        "DocCounts": { 
        "value": 0 
        } 
       } 
] 

我收到DocCounts = 0。這不是預期的。我的查詢出了什麼問題。

回答

0

我認爲你最後嵌套的aggregation太多了。試圖擺脫它:從上範圍值做嵌套式的一些聚集在

{ 
    "size": 0, 
    "aggs": { 
    "samples": { 
     "nested": { 
     "path": "sample" 
     }, 
     "aggs": { 
     "sample": { 
      "terms": { 
      "field": "sample.name", 
      "order": { 
       "DocCounts": "desc" 
      } 
      }, 
      "DocCounts": { 
      "cardinality": { 
       "field": "docid" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

這將返回錯誤。可能在這裏找到兩個聚合類型定義。我已經試過了 – Backtrack

+0

有沒有可能''field「:」sample.docid「'可以解決你的問題? – core

+0

我不這麼認爲 – Backtrack

0

在一般情況下,我們觀察,我們需要保存文檔時放/複製值從上範圍上嵌套類型。

然後在你的情況下聚集會是什麼樣子:

"aggs": { 
    "DocCounts": { 
    "cardinality": { 
     "field": "sample.docid"    
    } 
    } 
} 

它工作在這樣的情況下,至少在Elasticsearch的1.7版本。

0

您可以在DocCounts上的基數聚合之上使用反向嵌套聚合。這是因爲,當應用嵌套聚合時,查詢針對嵌套文檔運行。因此,要訪問嵌套文檔內的父文檔的任何字段,可以使用反向嵌套聚合。查詢ES Reference瞭解更多信息。

你的基數查詢將看起來像:

"aggs": { 
    "internal_DocCounts": { 
     "reverse_nested": { }, 
     "DocCounts": { 
      "cardinality": { 
       "field": "docid" 
      } 
     } 
    } 
} 

的響應將是這樣的:

"buckets": [ 
    { 
    "key": "xxxxx", 
    "doc_count": 173256, 
    "internal_DocCounts": { 
     "doc_count": 173256, 
     "DocCounts": { 
     "value": <some_value> 
     } 
    } 
    }, 
    { 
    "key": "yyyyy", 
    "doc_count": 63, 
    "internal_DocCounts": { 
     "doc_count": 63, 
     "DocCounts": { 
     "value": <some_value> 
     } 
    } 
    }, 
    ..... 

入住這similar thread

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/18808496) –

+0

這不會提供問題的答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你將可以[對任何帖子發表評論](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提問者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [來自評論](/ review/low-quality-posts/18808496) – Milney

+0

謝謝..改進了答案 – Tushar