2015-02-10 147 views
0

我在ElasticSearch中有這樣的文檔。我想要搜索並得到像sql server pivot的結果。但我不知道我該怎麼做。彈性搜索行到列

Name | Year | Gear 
C30 2012 A 
C30 2011 M 
C30 2014 M 
C30 2015 A 
C30 2013 A 
V40 2012 A 
V40 2013 M 
V40 2015 A 
S60 2012 M 
S60 2011 A 

當我搜索'C30 A'時,我想要顯示這樣的數據。

Name | Years 
C30 2012,2015,2013 

我該怎麼做? ES有可能嗎?

+0

請問您是否可以說明您的數據是否已經以上面顯示的格式編入索引?這意味着每個文檔都有一個名稱,年份和齒輪字段? – Manolis 2015-02-10 09:03:03

+0

您應該可以使用聚合。在這種情況下,在名稱和齒輪上使用篩選器的過濾器聚合以及年份中的嵌套術語聚合應該有所裨益。這會給你一個給定名字和裝備最常見的年份列表。 – 2015-02-10 11:15:50

+0

@Manolis我的數據在Elasticsearch中編入索引 – user1924375 2015-02-10 16:53:22

回答

1

如果您已將數據編入索引(即:每個文檔都有一個名稱,年份和齒輪字段),那麼正確的查詢將返回一份這種類型的文檔列表。

此類查詢的一個示例如下(更多選項可用 - 有關查詢dsl的更多信息,請點擊此處 - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl.html)。

"query": { 
    "bool": { 
     "must": [ 
      {"match": { "Name": "C30" }}, 
      {"match": { "Gear": "A" }}    
     ] 
    } 
} 

如果你想要一個結果作爲一個你描述你應該適用於你的數據的一些後處理它們從搜索結果收到後。但是,如果您的數據尚未編入索引,或者您不在意更改您的政策,那麼我會建議將數據非規範化並以最適合您的形式爲其編制索引。 我建議指數類似下面的文檔:

public class ObjectToIndex{ 
    public string Name; 
    public string Gear; 
    public List<string> Years; 
} 

你的數據會是這個樣子

Name | Gear | Years 
C30  A 2012,2015,2013 
C30  M 2011,2014 
V40  A 2012,2015 
V40  M 2013 
S60  A 2011 
S60  M 2012 

在這種情況下,像像上面將返回你的文檔的查詢:

C30, A, 2012,2015,2013