2017-08-14 134 views
0

我需要根據AND,OR查詢動態地進行彈性搜索查詢。彈性搜索中的OR查詢

用戶輸入類似於SQL格式的字符串:

((("query1 query2" OR query3) OR query4) AND (query5 OR query6)) AND query7 

我把它解析到數組:

[ 
    'AND' => [ 
     [ 
      'AND' => [ 
       [ 
        'OR' => [ 
         [ 
          'OR' => [ 
           '" query1 query 2"', 
           'query3' 
          ] 
         ], 
         'query4' 
        ] 
       ], 
       [ 
        'OR' => [ 
         'query5', 
         'query6' 
        ] 
       ] 
      ] 

     ], 
     'query7' 
    ] 

] 

而基於這個數組我需要做一個搜索一個領域上。

喜歡的東西:

{"bool":{"must":[{"match":{"title":"research"}},{"match":{"title":"lecturer"}}]}} 

但我堅持使用嵌套條件。請指教。

+0

您的查詢可以簡化爲這'( 「QUERY1 QUERY2」 OR QUERY3 OR查詢4)AND(查詢5或查詢6)AND查詢7「。然後,一個簡單的'bool/must'包裝兩個'bool/should'和一個'match'就可以完成這項工作。 – Val

回答

1

嵌套條件可以使用嵌套bool

((("query1 query 2" OR query3) OR query4) AND (query5 OR query6)) AND query7 

可爲表示:

{ 
    "query" : { 
     "bool":{ 
      "must" : [ 
       {   
        "bool":{ // ((("query1 query 2" OR query3) OR query4) AND (query5 OR query6)) 
         "must" : [ 
          { 
           "bool":{ // (("query1 query 2" OR query3) OR query4) 
            "should" : [          
             { 
              "bool":{ // ("query1 query 2" OR query3) 
               "should" : [ 
                {"match": // query1 query2}, 
                {"match": // query3} 
               ] 
              } 
             }, 
             {"match": // query4} 
            ] 
           } 
          }, 
          { 
           "bool":{ // (query5 OR query6) 
            "should" : [ 
             {"match": // query5}, 
             {"match": // query6} 
            ] 
           } 
          } 
         ] 
        } 
       }, 
       {match": //... query7} 
      ] 
     } 
    } 
}