如何解决Elasticsearch-索引之间的关联计数?
从关系数据库的背景出发,我想知道是否存在一种方法来检索两个索引之间的唯一关联数。
基本示例(使用关系数据库)
我有3张桌子:Person,Cars,Person-Cars
Person-Cars有两列(person_id,car_id),其中包含人与汽车之间的关联(所有权)数。
- 在Elasticsearch上,我为Person和Cars创建了一个索引。
要点
每次获取汽车文档时,我想知道有多少人拥有该汽车(IOW与独特的人有多少关联)
-
为此,我需要为Person-Cars创建另一个索引,然后必须为所有关联记录建立索引?有没有更简单的方法?在ES中最好的方法是什么?
我研究了汇总,但是我不确定只能在单个级别(人或汽车)上进行汇总。
谢谢!
解决方法
在Elasticsearch上,我为Person和Cars创建了一个索引。
在大多数情况下,在弹性搜索中以非规范化方式存储数据是有意义的,即将一对多关系定义为nested或parent-child关系,或者简单地以多值字段。
在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”, “汽车”:[1,2,3] }
在这种情况下,我们可以使用下面的查询获取id = 3的购车人数
GET person/_count
{
"query": {
"match": {
"cars": 3
}
}
如果共享更多上下文,则可以实现更好的建模。