2017-08-17 126 views
2

我要實現以下SQL查詢中彈性等價的:遍歷彈性搜索巢聚合C#

select BookId, PubDate, count(1) 
from BookMessages 
where BookId in (1,2) 
group by BookId, PubDate 

因此,我寫了下面的查詢在C#

var searchresponse = client.Search<BookMessages>(s => s 
     .Query(q => q 
     .Bool(bq => bq 
     .Filter(fq => fq.Terms(t => t.Field(f => f.BookId).Terms(BookList))))) 
     .Aggregations(a => a 
     .Terms("group_by_book", ts => ts 
     .Field(f => f.BookId) 
      .Aggregations(a1 => a1 
      .DateHistogram("Date", dat => dat 
      .Field(f1 => f1.PubDate) 
      .Interval(DateInterval.Day) 
      .Format("dd/MM/yyyy") 
     ))))); 

我試過循環的使用以下代碼輸出,但無法進一步循環。

foreach (var agg in searchresponse.Aggregations) 
{ 
    string key = agg.Key; 
    IAggregate objIAgg = agg.Value; 
} 

我可以看到quickwatch中的值,但是如何獲取獲取的值?

回答

1

根據NEST Aggregations Documentation,您需要指定要在結果中訪問的聚合。

有兩種方法可以做到這一點,通過Aggregations對象,你正在做的目前

IAggregate termAggregation = searchresponse.Aggregations["group_by_book"]; 

或者你可以使用Aggs方便幫手,以獲得正確類型的聚集反應出基於字典的關鍵的名字。在這種情況下,它會公開你的條款和相關屬性。

TermsAggregate<string> termAgg = searchresponse.Aggs.Terms("group_by_book"); 

從其中任何一個你現在應該能夠得到你想要的聚合值。您可以檢查這些可用的不同屬性,以便爲您找到合適的屬性。

此外,如果您查看Term Aggregations Unit tests in the NEST source code,您可以看到Aggs屬性的一些示例以及您可以訪問的內容。

+1

一般來說,我建議使用'Aggs'助手,因爲它會安全地執行從'IAggregate'到指定聚合的具體聚合類型的轉換。 –

+0

非常感謝Russ提供的建議,我使用了Aggs幫手,它對於演員陣容的轉換很有幫助。 – Hitesh