使用第二个索引计算索引中类型的文档数

时间:2014-07-25 09:53:50

标签: elasticsearch

在Elasticsearch中,假设我有两个索引my_usersuser_actions。此外,假设我的一些用户有一个字段vipID。我想计算具有(非空)climb字段的用户执行的vipID类型的用户操作数。

一方面,我知道如何过滤具有vipID字段的用户:

curl localhost:8080/my_users/_search
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "exists": {
          "field": "vipID"
        }
      }
    }
  }
}

另一方面,我知道如何找到用户1和2执行的所有爬升操作(即userID字段等于12:< / p>

curl localhost:8080/users_actions/climb/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "terms": {
          "adUserId": [
            "1",
            "2"
          ]
        }
      },
      "boost": 1.2
    }
  }
}

我不知道如何做到这两点?如何从第一个查询中插入asUserId的第二个查询。

编辑:

以上仅是一个最小的例子。基于评论,我编写了任务脚本。但是,在实际情况中,我有数千名用户,我从Argument list too long收到curl错误。

1 个答案:

答案 0 :(得分:0)

my_users的映射中,将user_actions指定为子文档。使用userID作为parentID对其进行索引。然后,您可以查询父级,并使用has_child过滤器过滤结果。像这样:

curl localhost:8080/my_users/_search
{
   "query": {
      "filtered": {
         "query": {
            "match_all": {}
         },
         "filter": {
            "and": [
               {
                  "exists": {
                     "field": "vipID"
                  }
               },
               {
                  "has_child": {
                     "type": "user_actions",
                     "query": {
                        "constant_score": {
                           "filter": {
                              "terms": {
                                 "adUserId": [
                                    "1",
                                    "2"
                                 ]
                              }
                           },
                           "boost": 1.2
                        }
                     }
                  }
               }
            ]
         }
      }
   }
}