elasticsearch,Join,elasticsearch" /> elasticsearch,Join,elasticsearch" />

Join ElasticSearch中的连接模拟

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请求两次

假设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 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
      2
      ,因此该数字只能是1或2
    • 然后使用
      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方法。