在弹性搜索中,我需要所有其用户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的所有文档。
在单个查询中是否有其他方法可以执行此操作。
答案 0 :(得分:1)
ES中不允许使用内部联接。来自RDBMS世界很难与之相关,但关系是速度的折衷。
ES有各种其他处理关系的方式,详细讨论here。
答案 1 :(得分:0)
除了原生方式之外,还可以使用SIREn Join Plugin。