gpt4 book ai didi

elasticsearch - 嵌套字段值的聚集Elasticsearch索引

转载 作者:行者123 更新时间:2023-12-02 23:27:26 25 4
gpt4 key购买 nike

我需要使用用户和文章对网站进行建模,使每个用户可以与任何文章多次互动(阅读,打开e.t.c)。我想通过遵循嵌套映射在一个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"}
]
}

我需要对数据进行以下汇总:
  • 每天通过嵌套聚合完成的互动总数:
    GET /_search
    {
    "size": 0,
    "aggs": {
    "by_date": {
    "nested": {
    "path": "interactions"
    },
    "aggs": {
    "m_date": {"terms": {"field": "interactions.interact_date"}}
    }
    }
    }
    }
  • 每天的唯一身份用户互动数。如果特定用户在同一日期范围内与几篇文章进行了互动,则该用户应仅被计数一次。
    在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索引中做同样的事情?
  • 如何在不重新索引整个文档的情况下通过_update添加交互?
  • 如何按特定文章过滤用户-仅当用户与指定文章之一互动时,才按日期对用户计数一次?

  • 谢谢

    最佳答案

    Number of unique users interactions per day.


    {
    "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"
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }

    How to add interactions by _update without re-indexing whole document?



    这不可能。这就是 definition of a nested object:要更新,添加或删除嵌套对象,我们必须为整个文档重新编制索引。

    How to filter users by specific articles - count user once in aggregation by date only if he interacted with one of specified articles?


    {
    "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"
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }

    关于elasticsearch - 嵌套字段值的聚集Elasticsearch索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41173958/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com