弹性搜索:如何'或'两个不同的嵌套查询?

时间:2013-09-06 08:23:33

标签: elasticsearch tire

我有一个User映射,如:

name: { 
 type: "string"
},
followed_groups: {
  type: "nested",
  properties: {
    created_at: {
      type: "string"
    },
    group_id: {
      type: "string"
    }
  }
},
id: {
  type: "integer"
},
member_of_groups: {
  type: "nested",
  properties: {
    created_at: {
      type: "string"
    },
    group_id: {
      type: "string"
    }
  }
}

我希望得到关注群组或其成员的用户。

每个单独的查询都可以使用嵌套查询,如:

"query":{
  "nested":{
    "query":{
      "terms":{
        "followed_groups.group_id":[
          "22"
        ]
      }
    },
    "path":"followed_groups"
  }
}

但我无法找到将两者合并为OR条件的方法。有可能吗?

1 个答案:

答案 0 :(得分:1)

在我看来,您并不关心使用查询提供的评分,请参阅下面的使用过滤器的解决方案。

可以简单地使用你在should指令中的查询数组中给出的查询指令:

{ "query" : {
  "bool" : {
    "should" : [
      {
        "query" : {
          "nested" : {
            "query" : {
              "terms" : {
                "followed_groups.group_id" : [
                  "22"
                ]
              }
            },
            "path" : "followed_groups"
          }
        }
      },
      {…}
    ]
  }
}}

可以在顶层使用过滤器,但在使用分面时这并不好,所以我在这里使用filtered查询:

{
  "query": {
    "filtered" : {
        "query" : { "match_all" : {} },
        "filter" :{   "or" : [
          {
            "nested":{
               "query":{
                 "terms":{
                   "followed_groups.group_id":[
                     "22"
                   ]
                 }
               },
               "path":"followed_groups"
             }
           },
           {…}
        ]
      }
    }
  }
}

我还没有对此进行测试,但这至少应该为您的查询提供正确的结构。