当前位置: 首页 > 面试题库 >

如何在Elasticsearch中对结果分组?

周滨海
2023-03-14
问题内容

我将书名存储在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和需求。

至于声明:Simon说,这需要大量的重构,尽管它是计划中的,但没有办法说它何时实施甚至交付。

克林顿·戈姆利(Clinton
Gormley)在他的网络研讨会上
也发表了类似的观点,即领域分组需要付出很多努力才能正确完成,尤其是因为Elasticsearch本质上是一个分片的分布式环境。如果您不考虑分片,那没什么大不了的,但是Elasticsearch只希望提供功能,这些功能可以与整个系统一起扩展,并且可以像在一个盒子上一样在数百台机器上正常工作。

如果您不依赖Elasticsearch,Solr会提供这样的功能

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

不完全是您想要的,但是您也可以进行汇总;为您创建一个存储桶,title并在id现场进行子聚合。您将不会获得store与此相关的值,但是一旦有了ID,就可以从数据存储中检索它们。

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

编辑
:似乎,与top_hits聚合,结果分组可以很快实现。



 类似资料:
  • 问题内容: 在我的elasticsearch索引“ people”中,包含以下文件: 我想得到一个文档的结果,该文档的分区为2或1,但是最多只能包含2个。因此,如果以上是我的整个索引,我希望它返回: 用Elastic中的单个查询是否可以实现此目标?非常感谢您的帮助! 问题答案: 这样的事情应该做到:

  • 问题内容: 想象一下,我有两种记录:一个存储桶和一个项目,其中存储在存储桶中的项目,而存储桶中的项目可能相对较少(通常不超过4个,从不超过10个)。这些记录被压缩为一个(具有更多存储桶信息的项目),并放置在Elasticsearch中。我要解决的任务是通过依赖项属性的过滤查询一次找到500个存储桶(最大),其中包含所有相关项,而我受困于限制/抵消聚合。我该如何执行此类任务?我看到聚合使我可以控制相

  • 我需要按、和的间隔(步长为5)对数据进行分组。对于每个组,我要估计中位数 我可以分组数据并计算的中值,但是我不知道如何添加的间隔: 正确的应该结构如下(数字可能不同,这只是数据结构的一个例子): 更新: 最终结果应该是这样的。因此,基本上,和分别是上下限:

  • 问题内容: 首先创建一些示例数据(e1,e2,e3是类型,而test是索引名称): 现在我的问题是:我怎样才能仅获得这两个数据?删除结果中具有相同ID的重复数据。 问题答案: 首先,您将需要搜索多个索引。 然后,在结果上删除重复的ID。

  • 我在ElasticSearch中索引了很多产品。我需要从ElasticSearch中的查询中排除ID列表(我从SQL数据库中获取)。假设产品存储为, 我们基于使用ElasticSearch的一些算法向客户显示推荐产品的列表。如果一个顾客把一个产品标记为‘不感兴趣',我们就不必再给他看那个产品了。我们将这些产品保存在一个单独的SQL表中,表中有product_id、customer_id,状态为'n

  • 问题内容: 我正在尝试使用ES作为MongoDB的索引。我已经成功地将它们集成在一起,但是我发现搜索API相当复杂且令人困惑。Java API也不太有用。 我可以找到完全匹配的内容,但是如何获得此结果?这是我的代码: 问题答案: 我不确定我是否理解您的问题。 如果要根据示例打印searchResponse的结果,则应为以下内容: 我正在使用Gson将Json响应转换为FireWall(POJO)。