弹性搜索行到列

时间:2015-02-10 02:50:06

标签: elasticsearch elastic-map-reduce elasticsearch-plugin

我在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有可能吗?

1 个答案:

答案 0 :(得分:1)

如果您已将数据编入索引,如图所示(这意味着:每个文档都有Name,Year和Gear字段),那么正确的查询将返回此类文档的列表。

此类查询的示例如下(更多选项可用 - 有关查询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