2015-02-10 89 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