Elasticsearch - 索引之间的关联计数?

Elasticsearch - Count of associations between indexes?

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

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

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

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

要点

每次获取 Car 文档时,我想知道有多少人拥有这辆车(IOW 它与唯一的人有多少关联)

--

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

我研究过聚合,但我认为这只能在一个单一的层面(人或汽车)上完成,我不确定。

谢谢!

On Elasticsearch, I have created an index for Person and for Cars.

大多数情况下,在弹性搜索中以非规范化方式存储数据是有意义的,即将 one-to-many 关系定义为 nested or parent-child 关系或简单地在 multi-value 字段中。

What would be the best way to do this in ES?

这取决于您的用例(parent-child 或嵌套或 multi-value)。为每种类型使用单独的索引肯定会增加开销。如果您添加您需要的其他用例和查询类型,那么只能更好地建模模式。

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

{
  "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.
}

每当一个人buy/sell一辆汽车,那么在这种情况下汽车文件需要更新。如果汽车的买卖经常发生,并且如果有人买了车,你需要同时更新汽车和人,那么这种建模就没有意义了。

在那种情况下,car_ids within-person doc :

是有意义的

{ “编号”:1, “名字”:“拉吉”, “汽车”:[1,2,3] }

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

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

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