gpt4 book ai didi

ElasticSearch 加入过滤器 : Using subquery results as filter input possible?

转载 作者:行者123 更新时间:2023-11-29 02:48:13 25 4
gpt4 key购买 nike

我有一个用例,我想使用 ElasticSearch 进行实时分析。在其中,我希望能够计算一些简单的亲和性分数。

这些目前是使用按条件过滤的用户群执行的交易数量与完整用户群进行比较来定义的。

据我了解,我需要执行以下操作:

  1. 获取我筛选的用户群的不同交易
  2. 在完整的用户群中查询这些交易(类型)
  3. 进行计算(标准化等)

为了获得过滤用户群的“不同交易”,我目前使用带有分面的条款过滤器查询,它返回所有条款(交易类型)。据我所知,我需要将此结果用作第二步的术语过滤器查询的输入,以便能够接收我想要的结果。

我读到 GitHub 上有一个 pull request 似乎实现了这个 ( https://github.com/elasticsearch/elasticsearch/pull/3278 ),但我不太清楚这是否已经在当前版本中可用。

如果没有,是否有一些解决方法可以实现它?

作为附加信息,这是我的示例映射:

curl -XPUT 'http://localhost:9200/store/user/_mapping' -d '
{
"user": {
"properties": {
"user_id": { "type": "integer" },
"gender": { "type": "string", "index" : "not_analyzed" },
"age": { "type": "integer" },
"age_bracket": { "type": "string", "index" : "not_analyzed" },
"current_city": { "type": "string", "index" : "not_analyzed" },
"relationship_status": { "type": "string", "index" : "not_analyzed" },
"transactions" : {
"type": "nested",
"properties" : {
"t_id": { "type": "integer" },
"t_oid": { "type": "string", "index" : "not_analyzed" },
"t_name": { "type": "string", "index" : "not_analyzed" },
"tt_id": { "type": "integer" },
"tt_name": { "type": "string", "index" : "not_analyzed" },
}
}
}
}
}'

因此,对于我的示例用例的实际期望结果,我将具有以下内容:

  1. 我过滤的用户群会有这个示例过滤器:“性别”:“男性”和“relationship_status”:“单例”。对于这些,我想获得不同的交易类型(嵌套文档的字段“tt_name”)并计算不同的 user_id 的数量。
  2. 接下来,我想查询我的完整用户群(除了 1 中的交易类型列表之外没有过滤器)并计算不同 user_id 的数量
  3. 进行“亲和性”计算

最佳答案

这是一个可运行示例的链接:

http://sense.qbox.io/gist/9da6a30fc12c36f90ae39111a08df283b56ec03c

它假定文档看起来像:

{ "transaction_type" : "some_transaction", "user_base" : "some_user_base_id" }

查询设置为不返回任何结果,因为聚合负责计算您正在寻找的统计信息:

{
"size" : 0,
"query" : {
"match_all" : {}
},
"aggs" : {
"distinct_transactions" : {
"terms" : {
"field" : "transaction_type",
"size" : 20
},
"aggs" : {
"by_user_base" : {
"terms" : {
"field" : "user_base",
"size" : 20
}
}
}
}
}
}

结果如下:

  "aggregations": {
"distinct_transactions": {
"buckets": [
{
"key": "subscribe",
"doc_count": 4,
"by_user_base": {
"buckets": [
{
"key": "2",
"doc_count": 3
},
{
"key": "1",
"doc_count": 1
}
]
}
},
{
"key": "purchase",
"doc_count": 3,
"by_user_base": {
"buckets": [
{
"key": "1",
"doc_count": 2
},
{
"key": "2",
"doc_count": 1
}
]
}
}
]
}
}

因此,在“聚合”中,您将拥有一个“distinct_transactions”列表。键将是交易类型,doc_count 将代表所有用户的总交易。

在每个“distinct_transaction”的内部,都有“by_user_base”,这是另一个术语 agg(嵌套)。就像交易一样,键将代表用户群名称(或 ID 或其他),而 doc_count 将代表该唯一用户群的交易数量。

这是您想要做的吗?希望我有所帮助。

关于ElasticSearch 加入过滤器 : Using subquery results as filter input possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21833092/

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