我想知道我可以在其他术语查找机制中嵌套术语查找机制查询。 例如:
curl -XPUT localhost:9200/users/user/2 -d '{
"tweets" : ["1", "3"]
}'
curl -XPUT localhost:9200/tweets/tweet/1 -d '{
"uuid" : "1",
"comments":["1","2","3"]
}'
curl -XPUT localhost:9200/comments/comment/1 -d '{
"uuid" : "1"
}'
如您所知,我们可以使用术语查找机制查询来获取属于用户的推文:
curl -XGET localhost:9200/tweets/tweet/_search -d'{
"query" : {
"terms" : {
"uuid" : {
"index" : "users",
"type" : "user",
"id" : "2",
"path" : "tweets"
}
}
}
}'
但如果我想得到评论,我必须做另一个查询。 但是我的文件很多,这不是一个好方法。 所以我想嵌套术语查询查询,以便只通过用户的id在一个查询中获取评论,我可以吗? 如果你能给我一些帮助,我将非常感激。谢谢! :)
答案 0 :(得分:0)
目前,据我所知,这是不可能的,因为您希望在一个查询中返回来自三个不同索引的数据,这相当于一个JOIN。术语查询查询排序实现两个索引之间的JOIN"仅#34; (考虑到ES首先不想支持JOIN这一事实,这已经非常酷了。)
解决此问题的一种方法是重构数据模型以摆脱comments
索引,并使用tweet
映射类型中的父/子和/或嵌套关系。由于评论只能属于一条推文,并且通常不会有数百条推文评论(我很满意这样的想法:99%的时间每条评论少于六个评论推文,如果有的话),您可以将评论添加为child documents或nested document(我的偏好),而不是仅将其ID存储在comments
数组中。这样,您就可以立即使用现有查询获得评论,而无需进行第二次查询。
curl -XPUT localhost:9200/tweets/tweet/1 -d '{
"uuid" : "1",
"comments":[{
"id": 1,
"content": "Nice tweet!"
},{
"id": 2,
"content": "Way to go!"
},{
"id": 3,
"content": "Sucks!"
}]
}'
或者您可以等待this pull request (#3278)(通过查询/过滤器查找条款(也称为加入过滤器))进行合并,这将有效地允许您执行您要求的操作,但该PR已经是在2年多前创建的,仍有冲突需要解决。