我想知道我是否可以在另一个术语查找机制中嵌套一个术语查找机制查询。例如:
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"
}'如您所知,我们可以使用术语查找机制查询来获取属于用户的tweet:
curl -XGET localhost:9200/tweets/tweet/_search -d'{
"query" : {
"terms" : {
"uuid" : {
"index" : "users",
"type" : "user",
"id" : "2",
"path" : "tweets"
}
}
}
}'但是,如果我想得到评论,我必须做另一个查询。但是我的文件这么多,这不是一个好方法。因此,我想嵌套术语查找查询,以便只按用户的id在一个查询中获得注释,可以吗?如果你能给我一些帮助,我会非常感激的。谢谢!:)
发布于 2015-12-24 04:43:46
目前,据我所知,这是不可能的,因为您希望在一个查询中返回来自三个不同索引的数据,这相当于一个联接。术语查找查询将实现两个索引之间的“只”连接(考虑到ES最初不支持联接这一事实,这已经相当酷了)。
解决这一问题的一种方法是重构数据模型,以摆脱comments索引,并在tweet映射类型中使用父/子和/或嵌套关系。由于一条评论只能属于一条推特,而且在一条推特上通常不会有数百条评论(我认为99%的情况下每条推文只有不到6条评论,如果有的话),您可以将评论添加为儿童文件或嵌套文档 (我的首选),而不是仅仅将它们的ids存储在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!"
}]
}'或者您可以等待此拉请求(#3278) (术语查询/筛选查找)。(加入过滤器))合并,这将有效地允许你做你想要的,但公关已经创建了两年多以前,仍然有冲突需要解决。
https://stackoverflow.com/questions/34446193
复制相似问题