具有多个必须和应该的嵌套布尔查询

时间:2019-03-25 07:09:35

标签: elasticsearch elastic-stack

在下面查看我的用例

两个嵌套字段

base1.point1
base1.point2
base1.point3
base1.point4

base2.point1
base2.point2
base2.point3
base2.point4

搜索条件

(
  (base1.point1 AND base1.point2) OR (base1.point2 AND base1.point3)
)
AND
(
  (base2.point1 AND base2.point2) OR (base2.point2 AND base2.point3)
)

请帮助在单个查询中撰写以上内容。

1 个答案:

答案 0 :(得分:0)

请注意,我假设您的意思是嵌套的,实际上是在谈论Nested Datatype而不是简单的Object Datatype

还要查看您的问题,您只关心嵌套字段是否存在,无论它们的值如何。对于此类用例,您将需要使用Exists Query

下面是我的Nested Query的样子:

POST <you_index_name>/_search
{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "bool":{  
                  "should":[  
                     {  
                        "bool":{  
                           "must":[  
                              {  
                                 "nested":{  
                                    "path":"base1",
                                    "query":{  
                                       "exists":{  
                                          "field":"base1.point1"
                                       }
                                    }
                                 }
                              },
                              {  
                                 "nested":{  
                                    "path":"base1",
                                    "query":{  
                                       "exists":{  
                                          "field":"base1.point2"
                                       }
                                    }
                                 }
                              }
                           ]
                        }
                     },
                     {  
                        "bool":{  
                           "must":[  
                              {  
                                 "nested":{  
                                    "path":"base1",
                                    "query":{  
                                       "exists":{  
                                          "field":"base1.point2"
                                       }
                                    }
                                 }
                              },
                              {  
                                 "nested":{  
                                    "path":"base1",
                                    "query":{  
                                       "exists":{  
                                          "field":"base1.point3"
                                       }
                                    }
                                 }
                              }
                           ]
                        }
                     }
                  ]
               }
            },
            {  
               "bool":{  
                  "should":[  
                     {  
                        "bool":{  
                           "must":[  
                              {  
                                 "nested":{  
                                    "path":"base2",
                                    "query":{  
                                       "exists":{  
                                          "field":"base2.point1"
                                       }
                                    }
                                 }
                              },
                              {  
                                 "nested":{  
                                    "path":"base1",
                                    "query":{  
                                       "exists":{  
                                          "field":"base2.point2"
                                       }
                                    }
                                 }
                              }
                           ]
                        }
                     },
                     {  
                        "bool":{  
                           "must":[  
                              {  
                                 "nested":{  
                                    "path":"base2",
                                    "query":{  
                                       "exists":{  
                                          "field":"base2.point2"
                                       }
                                    }
                                 }
                              },
                              {  
                                 "nested":{  
                                    "path":"base2",
                                    "query":{  
                                       "exists":{  
                                          "field":"base2.point3"
                                       }
                                    }
                                 }
                              }
                           ]
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}

希望这会有所帮助!