首页 > 解决方案 > Elasticsearch - 索引之间的关联计数?

问题描述

来自关系数据库背景,我想知道是否有办法检索两个索引之间的唯一关联数。

基本示例(使用关系数据库)

我有 3 个表:Person、Cars、Person-Cars

Person-Cars 有两列(person_id、car_id)并保存人和汽车之间的关联(所有权)数量。

重点

每次我获取汽车文档时,我都想知道有多少人拥有这辆车(IOW 与独特的人有多少关联)

--

为了实现这一点,我需要另一个 Person-Cars 索引,然后必须索引所有关联记录?有没有更简单的方法?在 ES 中执行此操作的最佳方法是什么?

我已经研究过聚合,但我认为只能在单个级别(人或汽车)上完成,不确定。

谢谢!

标签: elasticsearchelastic-stack

解决方案


在 Elasticsearch 上,我为 Person 和 Cars 创建了一个索引。

大多数时候,在弹性搜索中以非规范化方式存储数据是有意义的,即将一对多关系定义为嵌套关系或父子关系,或者简单地在多值字段中。

在 ES 中执行此操作的最佳方法是什么?

这取决于您的用例(父子或嵌套或多值)。每种类型都有单独的索引肯定会增加开销。如果您添加您需要的其他用例和查询类型,那么只有模式可以更好地建模。

仅考虑共享用例:以下汽车文档将解决您的情况:

{
  "id":1,
  "brand":"Hyundai",
  "owners":[21,31,51] // <===== Ids of owners. Ids & names both can be stored if required.
  "owners_cnt": 3 // <==== OR You can simply maintain the counter as well.
}

每当一个人购买/出售汽车时,在这种情况下都需要更新汽车文件。如果汽车的买卖频繁发生,并且如果一个人买了汽车,您需要同时更新汽车和人,那么这种类型的建模就没有意义了。

在这种情况下,在个人文档中拥有 car_ids 是有意义的:

{ "id":1, "name":"Raj", "cars":[1,2,3] }

在这种情况下,我们可以使用下面的查询来获取购买汽车的人数,id=3

GET person/_count
    {
      "query": {
        "match": {
          "cars": 3
        }
      }

如果共享更多上下文,则可以再次实现更好的建模。


推荐阅读