Join ElasticSearch中的连接模拟
假设ES索引中有两个字段的文档,Join ElasticSearch中的连接模拟,join,
elasticsearch,Join,
elasticsearch,假设ES索引中有两个字段的文档,user\u id和action\u id。如何计算用户数,以使文档同时具有action\u id=1和action\u id=2 等效的SQL是 选择计数(不同的'a`.'uuid`) 从“action”改为“a”` 将'action'作为'a'上的'b'连接。'user\u id`='b`.'user\u id`` 其中,`a`.`action\u id`=1 和'b`.'action_id`=2 我找到了唯一的方法:使用这些action\u ids请求两次
user\u id
和action\u id
。如何计算用户数,以使文档同时具有action\u id=1
和action\u id=2
等效的SQL是
选择计数(不同的'a`.'uuid`)
从“action”改为“a”`
将'action'作为'a'上的'b'连接。'user\u id`='b`.'user\u id``
其中,`a`.`action\u id`=1
和'b`.'action_id`=2
我找到了唯一的方法:使用这些
action\u id
s请求两次所有唯一的user\u id
s,并在ES客户端上查找结果集的交集。然而,这种方法需要从ES传输兆字节的数据,因此我正在寻找一种替代方法。您可以这样做:
"aggregations": {
"users": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 1,
"doc_count": 2,
"actions": {
"value": 2
}
},
{
"key": 5,
"doc_count": 2,
"actions": {
"value": 2
}
}
]
}
}
- 首先,您有一个查询,它只使用操作
和1
过滤文档(我不知道您是否可以使用其他操作类型)2
- 然后是聚合的魔力
- 第一个聚合是针对
的用户id
聚合,因此您可以对每个用户进行单独的计算术语
- 然后使用
子聚合来计算每个用户的不同操作数。由于查询的是操作基数
和1
,因此该数字只能是1或22
- 然后使用
子聚合仅保留基数结果为bucket\u选择器
的用户2
- 第一个聚合是针对
"aggregations": {
"users": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": 1,
"doc_count": 2,
"actions": {
"value": 2
}
},
{
"key": 5,
"doc_count": 2,
"actions": {
"value": 2
}
}
]
}
}
键是用户ID,其操作是1
和2
<代码>bucket_选择器
聚合在2.x+版本的ES中可用。您可能应该查看父-子关系@slawek这是统计信息,以便它逐行进入ES。正如我从手册中了解到的,添加一个孩子需要在ES中重新创建家长和所有孩子。这可能是几GB的数据。不知道你从哪里得到的。在我链接的页面中:“可以添加、更改或删除子文档,而不会影响父文档或其他子文档。这在子文档数量较多且需要频繁添加或更改时特别有用。”我以前尝试过这种方法,在大多数情况下都有效。ES中有一些聚合可以在另一个聚合的结果上运行,我已经尝试在结果中使用单个数字(尽管没有成功)。然而,由于我忘记在问题中提到的原因,这种方法对我来说不起作用,所以我不得不使用user\u id
intersection方法。