通过嵌套的字段值汇总Elasticsearch索引

赫什

我需要使用用户和文章来对网站进行建模,其中每个用户可以与任何文章多次互动(阅读,打开等)。我想通过遵循嵌套映射在一个elasticsearch索引中对该数据进行建模:

{
    "mappings": {
        "user": {
            "properties": {
                "user_id": {"type": "string"},
                "interactions": {
                    "type": "nested",
                    "properties": {
                        "article_id": {"type": "string"},
                        "interact_date": {"type": "date"}
                    }
                }
            }
        }
    }
}

索引文件的示例:

{
    "user_id": 20,
    "interactions": [
        {"article_id": "111", "interact_date": "2015-01-01"},
        {"article_id": "111", "interact_date": "2015-01-02"},
        {"article_id": "222", "interact_date": "2015-01-01"}
     ]
}

我需要对数据进行以下汇总:

  1. 每天通过嵌套聚合完成的互动总数:

    GET /_search
    {
        "size": 0,
        "aggs": {
            "by_date": {
                "nested": {
                    "path": "interactions"
                },
                "aggs": {
                    "m_date": {"terms": {"field": "interactions.interact_date"}}
                }
            }
        }
    }
    
  2. 每天的唯一身份用户互动次数。如果特定用户在同一日期范围内与几篇文章进行了互动,则该用户应仅被计数一次。在postgres中,它是简单的查询:对于具有3列的表[user_id,article_id,interact_date]

    SELECT dt, count(uid)
    FROM (SELECT interact_date::TIMESTAMP::DATE dt, user_id uid FROM interactions
            GROUP BY interact_date::TIMESTAMP::DATE, user_id) by_date
    GROUP BY dt;
    

    如何在Elasticsearch索引中做同样的事情?

  3. 如何通过_update添加交互而不重新索引整个文档?

  4. 如何按特定文章过滤用户-仅当用户与指定文章之一互动时,才按日期对用户进行一次统计?

谢谢

安德烈·斯特凡(Andrei Stefan)

每天的唯一身份用户互动次数。

{
  "size": 0,
  "aggs": {
    "nested_agg": {
      "nested": {
        "path": "interactions"
      },
      "aggs": {
        "per_day": {
          "date_histogram": {
            "field": "interactions.interact_date",
            "interval": "day",
            "min_doc_count": 1
          },
          "aggs": {
            "users_count": {
              "reverse_nested": {},
              "aggs": {
                "uniques": {
                  "cardinality": {
                    "field": "user_id"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

如何通过_update添加交互而不重新索引整个文档?

这不可能。这是嵌套对象定义要更新,添加或删除嵌套对象,我们必须为整个文档重新编制索引。

如何按特定文章过滤用户-仅当用户与指定文章之一互动时,才按日期对用户进行一次统计?

{
  "size": 0,
  "query": {
    "nested": {
      "path": "interactions",
      "query": {
        "term": {
          "interactions.article_id": {
            "value": "222"
          }
        }
      }
    }
  },
  "aggs": {
    "nested_agg": {
      "nested": {
        "path": "interactions"
      },
      "aggs": {
        "filtered": {
          "filter": {
            "term": {
              "interactions.article_id": {
                "value": "222"
              }
            }
          },
          "aggs": {
            "per_day": {
              "date_histogram": {
                "field": "interactions.interact_date",
                "interval": "day",
                "min_doc_count": 1
              },
              "aggs": {
                "users_count": {
                  "reverse_nested": {},
                  "aggs": {
                    "uniques": {
                      "cardinality": {
                        "field": "user_id"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章