Elasticsearch - 仅在按特定字段进行多次匹配时才检索文档

时间:2017-10-25 08:38:53

标签: elasticsearch

我在Elasticsearch中有一个用户帖子的索引。我想从这个索引中检索user_id,如果在给定的日期范围内,至少有X个帖子。否则跳过这样的帖子。

无论如何,我可以在ES中实现它,或者我必须得到所有实体并在以后处理它们?

Trawa;)

1 个答案:

答案 0 :(得分:0)

要回答您的问题,我们会假设您的地图中包含userdatetime字段。

您可以像这样获取所请求的数据:

获取在给定日期范围内拥有超过X(即X = 100)帖子的用户列表 - 按特定日期范围的用户名汇总:

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "datetime": {
              "gte": "2017-05-01",
              "lt": "2017-06-01"
            }
          }
        }
      ]
    }
  },
  "aggregations": {
    "users": {
      "terms": {
        "field": "user",
        "min_doc_count": 100
      }
    }
  }
}

修改查询以使您的日期范围(及其格式)和min_doc_count与每位用户的最低X帖子相匹配。

修改

无法避免terms_aggregation获取所有不同的值。 50k值似乎确实需要检索大量数据 - 但它还取决于您的群集。 我的建议是添加另一个过滤器,比方说,按字母顺序过滤,而不是在其他几个查询中一次性获得50k结果:

"must": [
        {
          "range": {
            "datetime": {
              "gte": "2017-05-01",
              "lt": "2017-06-01"
            }
          }
        },
        {
          "wildcard": {
            "user": "a*"
          }
        },
        {
          "wildcard": {
            "user": "b*"
          }
        }
      ]

请参阅Wildcard

不幸的是,滚动聚合结果不可用。手动将数据分成碎片是我现在能看到的最好的东西。