可以将术语查找机制查询嵌套

时间:2015-12-24 01:42:02

标签: elasticsearch

我想知道我可以在其他术语查找机制中嵌套术语查找机制查询。 例如:

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在一个查询中获取评论,我可以吗? 如果你能给我一些帮助,我将非常感激。谢谢! :)

1 个答案:

答案 0 :(得分:0)

目前,据我所知,这是不可能的,因为您希望在一个查询中返回来自三个不同索引的数据,这相当于一个JOIN。术语查询查询排序实现两个索引之间的JOIN"仅#34; (考虑到ES首先不想支持JOIN这一事实,这已经非常酷了。)

解决此问题的一种方法是重构数据模型以摆脱comments索引,并使用tweet映射类型中的父/子和/或嵌套关系。由于评论只能属于一条推文,并且通常不会有数百条推文评论(我很满意这样的想法:99%的时间每条评论少于六个评论推文,如果有的话),您可以将评论添加为child documentsnested 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年多前创建的,仍有冲突需要解决。