当前位置:  开发笔记 > 编程语言 > 正文

如何将结果分组到elasticsearch?

如何解决《如何将结果分组到elasticsearch?》经验,为你挑选了1个好方法。

我将书籍标题存储在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"
                     }
                ]
            }
        }
    ]
}
}

knutwalker.. 9

你在寻找什么是不可能的Elasticsearch,至少不是当前版本(1.1).

这个功能有很长的突出问题,其中有很多+ 1和需求.

至于陈述:西蒙说,它需要大量的重构,虽然它是有计划的,但没有办法说,何时实施甚至发货.

Clinton Gormley在他的网络研讨会上发表了类似的声明,即分组领域需要付出很多努力,特别是因为Elasticsearch本质上是一个分片和分布式环境.如果你不理会分片,那就不是什么大不了的事了,但是Elasticsearch想要只发布功能,这些功能可以与整个系统一起扩展,并且可以像在一个盒子上一样在数百台机器上运行.

如果您不依赖于Elasticsearch,Solr会提供此类功能.

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

不完全是你想要的,但你也可以去聚合 ; 为您创建一个存储桶,title并在该id字段上完成子聚合.您不会store使用此值获取值,但是一旦有了ID,就可以从数据存储中检索它们.

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

编辑:看来,使用top_hits聚合,结果分组可以很快实现.



1> knutwalker..:

你在寻找什么是不可能的Elasticsearch,至少不是当前版本(1.1).

这个功能有很长的突出问题,其中有很多+ 1和需求.

至于陈述:西蒙说,它需要大量的重构,虽然它是有计划的,但没有办法说,何时实施甚至发货.

Clinton Gormley在他的网络研讨会上发表了类似的声明,即分组领域需要付出很多努力,特别是因为Elasticsearch本质上是一个分片和分布式环境.如果你不理会分片,那就不是什么大不了的事了,但是Elasticsearch想要只发布功能,这些功能可以与整个系统一起扩展,并且可以像在一个盒子上一样在数百台机器上运行.

如果您不依赖于Elasticsearch,Solr会提供此类功能.

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

不完全是你想要的,但你也可以去聚合 ; 为您创建一个存储桶,title并在该id字段上完成子聚合.您不会store使用此值获取值,但是一旦有了ID,就可以从数据存储中检索它们.

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

编辑:看来,使用top_hits聚合,结果分组可以很快实现.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有