ElasticSearch中的子查询

时间:2017-02-14 06:09:52

标签: elasticsearch elasticsearch-2.0

在弹性搜索中,我需要所有其用户ID都是执行另一个弹性搜索查询的文档

{
"size": 200,
"query": {
    "bool": {
        "must": {
            "match": {
                "targetId": {
                    "query": 1234
                }
            }
        }
    }
},
"_source": {
    "includes": [
        "userId"
    ],
    "excludes": []
}
}

如果在sql中执行将有一个类似于下面的查询。

select * from mytable where userId in (select userId from mytable where targetId = 1234);

但我无法形成类似的弹性搜索查询,还有其他一些 在elasticsearch中实现子查询的方法。

要详细说明问题,我已添加以下数据

"hits": [
     {
        "_index": "idx0",
        "_type": "1234",
        "_id": "1235-1486716882293",
        "_source": {
           "targetid": "42644",
           "userid": "15784334830333693",
        }
     },
     {
        "_index": "idx0",
        "_type": "1234",
        "_id": "1235-1486716882293",
        "_source": {
           "data": {
              "info":"user data available"
           },
           "userid": "15784334830333693",
        }
     },
     {
        "_index": "idx0",
        "_type": "1234",
        "_id": "1235-1486716882293",
        "_source": {
           "data": {
              "info":"user data available"
           },
           "userid": "00000034830333693",
        }
     }
  ]

从上面的数据可以看出,用户文档只包含用户ID的数据,已经达到目标的用户信息存储在另一个具有targetid和userid的文档中。

要找出已达到目标的用户,我需要执行两个查询  1.get userids ES使用我拥有的targetid,  2.设置具有上一次查询中的用户ID的所有文档。

在单个查询中是否有其他方法可以执行此操作。

2 个答案:

答案 0 :(得分:1)

ES中不允许使用内部联接。来自RDBMS世界很难与之相关,但关系是速度的折衷。

ES有各种其他处理关系的方式,详细讨论here

答案 1 :(得分:0)

除了原生方式之外,还可以使用SIREn Join Plugin