elasticsearch,subquery,term,Join,Filter,elasticsearch,Subquery,Term" /> elasticsearch,subquery,term,Join,Filter,elasticsearch,Subquery,Term" />

Join ElasticSearch联接筛选器:是否可以使用子查询结果作为筛选器输入?

Join ElasticSearch联接筛选器:是否可以使用子查询结果作为筛选器输入?,join,filter,elasticsearch,subquery,term,Join,Filter,elasticsearch,Subquery,Term,我有一个使用ElasticSearch进行实时分析的用例。在这里面,我希望能够计算一些简单的亲和力分数 这些当前是使用按标准筛选的用户库执行的事务数(与完整用户库相比)来定义的 根据我的理解,我需要做以下工作: 获取筛选用户群的不同事务 在完整的用户库中查询这些事务(类型) 进行计算(标准化等) 为了获得过滤后的用户群的“不同事务”,我目前使用了一个术语过滤器查询,该查询带有faceting,它返回所有术语(事务类型)。据我所知,在第二步中,我需要使用这个结果作为术语过滤器查询的输入,以便能够接

我有一个使用ElasticSearch进行实时分析的用例。在这里面,我希望能够计算一些简单的亲和力分数

这些当前是使用按标准筛选的用户库执行的事务数(与完整用户库相比)来定义的

根据我的理解,我需要做以下工作:

  • 获取筛选用户群的不同事务
  • 在完整的用户库中查询这些事务(类型)
  • 进行计算(标准化等)
  • 为了获得过滤后的用户群的“不同事务”,我目前使用了一个术语过滤器查询,该查询带有faceting,它返回所有术语(事务类型)。据我所知,在第二步中,我需要使用这个结果作为术语过滤器查询的输入,以便能够接收我想要的结果

    我读到GitHub上有一个pull请求,它似乎实现了这个(),但我并不清楚这是否已经在当前版本中可用

    如果没有,是否有一些变通方法,我如何实现这一点

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

    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" },
            }
          }
        }
      }
    }'
    
    因此,对于我的示例用例的实际期望结果,我有以下内容:

  • 我的筛选用户群将有以下示例筛选器:“性别”:“男性”和“关系状态”:“单身”。对于这些,我希望获得不同的事务类型(嵌套文档的字段“tt_name”),并计算不同的用户id的数量
  • 接下来,我想查询我的完整用户群(除1中的事务类型列表外,没有其他筛选器),并计算不同用户ID的数量
  • 进行“亲和力”计算

  • 下面是一个可运行示例的链接:

    它假定文档如下所示:

    { "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
                         }
                      ]
                   }
                }
             ]
          }
       }
    
    因此,在“聚合”中,您将有一个“不同的_事务”列表。该键将是交易类型,单据计数将表示所有用户的总交易

    在每一个“不同的”事务中,都有“按用户”基,这是另一个术语agg(嵌套)。与事务一样,键将表示用户库名称(或ID或其他名称),文档计数将表示唯一的用户库事务


    这就是你想要做的吗?希望我能帮上忙。

    对于ElasticSerach的当前版本,有了新的
    重要\u术语
    聚合类型,可以用它以更简单的方式计算我的用例的相似性分数


    所有与我相关的指标都可以在一个步骤中计算出来,这非常好

    谢谢!如果我尝试运行它,我会收到“嵌套:SearchParseException[[transactions][0]:query[ConstantCore(:)],from[-1],size[0]:解析失败[No parser for element[aggs]]”错误。您能检查一下吗?sense.qbox.io上的localhost是否可能是0.90 ElasticSearch服务器?Tobi,很抱歉没有澄清。我提供的示例必须在1.0.0或更高版本上运行。如果您是从sense.qbox.io示例中点击localhost,那么您需要将本地ES升级到1.0.0以使用聚合。Ben,您能看看我的映射,看看您的方法是否也适用于嵌套文档吗?它肯定有效。试试这个:这就是你想要做的吗?github中引用此讨论的另一个问题是: