elasticsearch,Sql,elasticsearch" /> elasticsearch,Sql,elasticsearch" />

Sql Elasticsearch中的联接-嵌套查询或父查询能否处理此联接情况?

Sql Elasticsearch中的联接-嵌套查询或父查询能否处理此联接情况?,sql,elasticsearch,Sql,elasticsearch,我在Elastic中有一些类似这样的数据(将其转换为表格格式,我就是这样描述的) 等等 我想做的是找到所有的实例,在这些实例中,action_taked='search'和user都在实验中_condition='B' 这在SQLLand中非常简单,但我正在努力找出如何在Elastic中实现这一点 我在这里查看了父/子查询: 但这似乎不是我想要的,但也许我只是有麻烦把我的大脑围绕着它 谢谢 编辑:以下是ES中的JSON记录 { "_index": "04-06-2017", "_type

我在Elastic中有一些类似这样的数据(将其转换为表格格式,我就是这样描述的)

等等

我想做的是找到所有的实例,在这些实例中,action_taked='search'和user都在实验中_condition='B'

这在SQLLand中非常简单,但我正在努力找出如何在Elastic中实现这一点

我在这里查看了父/子查询: 但这似乎不是我想要的,但也许我只是有麻烦把我的大脑围绕着它

谢谢

编辑:以下是ES中的JSON记录

{
  "_index": "04-06-2017",
  "_type": "logs",
  "_id": "record_id_123",
  "_score": null,
  "_source": {
    "@version": "1",
    "@timestamp": "2017-04-06T03:59:42.000Z",
    "datetime": "05/Apr/2017:23:59:42 -0400",
    "duration": "05/Apr/2017:23:59:42 -0400",
    "sessionid": "session_hash_1234",
    "un": "user_id_1234",
    "ev": "login",
    "experimentGroup": "B"
  },
  "fields": {
    "@timestamp": [
      1491451182000
    ]
  }
},
{
  "_index": "04-06-2017",
  "_type": "logs",
  "_id": "record_id_567",
  "_score": null,
  "_source": {
    "@version": "1",
    "@timestamp": "2017-04-06T04:00:22.000Z",
    "datetime": "06/Apr/2017:00:00:22 -0400",
    "rc": "200",
    "pcd": "85",
    "duration": "06/Apr/2017:00:00:22 -0400",
    "un": "user_id_1234",
    "sessionid": "session_hash_1234",
    "rtid": "query_hash_1234",
    "js": "1",
    "rs": "1422x889",
    "cd": "16",
    "ln": "en",
    "tz": "GMT%20-04%3A00",
    "action": "toc",
    "event": "click",
    "node": "BUTTON",
    "ev": "search",
    "query":"query_terms_here"
  },
  "fields": {
    "@timestamp": [
      1491451222000
    ]
  },
}

我想做的是能够找到ev='search'中所有用户的所有记录,这些用户的实验组='B'

因此,在与之斗争了一段时间后,我决定只做两个查询。通过使用python的弹性插件,我可以获得所需的数据,然后发出一个包含所有用户列表的术语查询

获取用户:

blob=es.search(index='my-index', body={
  "size": 0,
  "query": {
    "query_string": {
      "query": "settings.experimentGroup:\"A\""
    }
  }
})
然后把它变成一个列表

users_in_group_a = json_normalize(blob['hits']['hits'])
unique_users_in_a=list(set(users_in_group_a['_id']))
然后获取这些用户的结果:

blob = es.search(index='my-index', body={
        "size":0,
  'query': {
          'filtered': {
                  'filter': {
                          'bool':{
                                  'must':[
                                          {'terms': { 'userid': [unique_users]}},
                                          {'range':{'@timestamp':{'gte':1489280900154,'lte':1491005332057}}}
                                          ]
                                  }
                          }
            }
})

这个答案可能会有帮助:(提示:反规范化)感谢@Val的编辑和评论。如果我正确阅读了您对链接问题的回答,您建议在数据方面进行反规范化。我不能改变数据结构,它已经相当平坦了。我将用弹性数据结构更新我的问题。
blob = es.search(index='my-index', body={
        "size":0,
  'query': {
          'filtered': {
                  'filter': {
                          'bool':{
                                  'must':[
                                          {'terms': { 'userid': [unique_users]}},
                                          {'range':{'@timestamp':{'gte':1489280900154,'lte':1491005332057}}}
                                          ]
                                  }
                          }
            }
})