elasticsearch,Lucene,elasticsearch" /> elasticsearch,Lucene,elasticsearch" />

Lucene 如何在elasticsearch中对结果进行分组?

Lucene 如何在elasticsearch中对结果进行分组?,lucene,elasticsearch,Lucene,elasticsearch,我在elasticsearch中存储书籍标题,它们都属于许多商店。像这样: { "books": [ { "id": 1, "title": "Title 1", "store": "store1" }, { "id": 2, "title": "Title 1", "s

我在elasticsearch中存储书籍标题,它们都属于许多商店。像这样:

{
    "books": [
        {
            "id": 1,
            "title": "Title 1",
            "store": "store1" 
        },
        {             
            "id": 2,
            "title": "Title 1",
            "store": "store2" 
        },
        {             
            "id": 3,
            "title": "Title 1",
            "store": "store3" 
        },
        {             
            "id": 4,
            "title": "Title 2",
            "store": "store2" 
        },
        {             
            "id": 5,
            "title": "Title 2",
            "store": "store3" 
        }
    ]
}
我怎样才能得到所有的书并按书名分组。。。每个组一个结果(一行有相同标题的组,这样我就可以得到所有ID和存储)

基于以上数据,我想得到两个结果,其中包含所有ID和存储

预期成果:

{
"hits":{
    "total" : 2,
    "hits" : [
        {                
            "0" : {
                "title" : "Title 1",
                "group": [
                     {
                         "id": 1,
                         "store": "store1"
                     },
                     {
                         "id": 2,
                         "store": "store2"
                     },
                     {
                         "id": 3,
                         "store": "store3"
                     },
                ]
            }
        },
        {                
            "1" : {
                "title" : "Title 2",
                "group": [
                     {
                         "id": 4,
                         "store": "store2"
                     },
                     {
                         "id": 5,
                         "store": "store3"
                     }
                ]
            }
        }
    ]
}
}

在Elasticsearch中,您所寻找的是不可能的,至少在当前版本(1.1)中是不可能的

有一个长期未完成与许多+1的背后和需求

至于语句:,它需要大量的重构,尽管它是计划好的,但没有办法说它将在什么时候实现甚至发布

类似的说法是,字段分组需要付出大量努力才能正确完成,特别是因为Elasticsearch本质上是一个分片分布式环境。如果你忽略切分,那就没什么大不了的了,但是Elasticsearch只想提供一些功能,这些功能可以与整个系统一起扩展,并且可以在数百台机器上工作,就像在一个盒子上一样

如果您没有绑定到Elasticsearch

否则,目前最好的解决方案可能是在客户端执行此操作。也就是说,查询一些文档,在客户机上进行分组,如果需要,获取更多结果以满足所需的组大小(据我所知,这就是Solr在幕后所做的)

不完全是你想要的,但你也可以去;为您的
标题创建一个bucket
,并在
id
字段上进行子聚合。您将无法使用此命令获取
存储
值,但一旦您拥有ID,就可以从数据存储中检索它们

{
    "aggs" : {
        "titles" : {
            "terms" : { "field" : "title" },
            "aggs": {
                "ids": {
                    "terms": { "field" : "id" }
                }
            }
        }
    }
}

编辑:似乎,使用,结果分组可以很快实现。

与SQL的类似行 分组 Elasticsearch提供聚合

对于聚合查询,Elasticsearch使用bucket进行响应


一个bucket对应一个类别(组)。

您可以使用聚合中的聚合来实现上述所需的结果,并使用top\u hits aggs。 前


我也有同样的问题,但我发现最好的解决方案是更改映射。您可以将映射转换为字段“store”的嵌套类型。这是因为你有一种多对多的关系。通过这种方式,您可以应用排序、分页。我希望能帮上忙

指定的服务器已关闭。我整天都在找这种东西!它的发展很快。看一看?
aggs: {
        "set": {
            "terms": {
                field: "id"
            },
            "aggs": {
                "color": {
                    "terms": {
                        field: "color"
                    },
                    "aggs": {
                        "products": {
                            "top_hits": {
                                _source:{
                                    "include":["size"]
                                }
                            }
                        }
                    }
                },
                "product": {
                    "top_hits": {
                        _source:{
                            "include":["productDetails"]
                        },
                        size: 1
                    }
                }
            }
        }
    }