2016-11-20 217 views
1

上elasticsearch複雜的查詢,我有一個書單,每本書有嵌套的標籤:嵌套的對象

"hits": [ 
      { 
      "_index": "", 
      "_type": "", 
      "_id": "", 
      "_score": , 
      "_source": { 
       "name": "book1", 
       "tags": [ 
       { 
        "t": "tagA", 
        "w": 100 
       }, 
       { 
        "t": "tagB", 
        "w": 0 
       },     
       ], 

       "active": true, 
      } 
      }, 
      { 
      "_index": "", 
      "_type": "", 
      "_id": "", 
      "_score": , 
      "_source": { 
       "name": "book2", 
       "tags": [ 
       { 
        "t": "tagA", 
        "w": 100 
       }, 
       { 
        "t": "tagB", 
        "w": 0 
       },     
       ], 

       "active": true, 
      } 
      }, 
     { 
      "_index": "", 
      "_type": "", 
      "_id": "", 
      "_score": , 
      "_source": { 
       "name": "book3", 
       "tags": [ 
       { 
        "t": "tagC", 
        "w": 100 
       }, 
       { 
        "t": "tagB", 
        "w": 0 
       },     
       ], 

       "active": false, 
      } 
      }] 

首先,我試圖讓所有的「活躍」的書籍與特定的標籤,這可以通過這個得到查詢:

GET /index/type/_search 
{ 
    "query": { 
    "bool": { 
     "must_not": {"term" : { "active" : false}}, 
     "must": 
     [ 
     { 
     "nested": { 
      "path": "tags", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "match": { 
         "tags.t": "tagB" 
        } 
        } 
       ] 
       } 
      } 
      } 
     } 
    ] 
    } 
    } 
} 

爲上述,book1和book2返回。

但我現在想要得到的東西變得更加複雜。 我正在嘗試使用特定標記(tagB)獲得「有效」書籍。但是如果'tagC'在書中,那麼如果書不活躍,書也可以返回。

所以對於這個問題,book1,book2,book3會返回。

如何在elasticsearch中執行此查詢?

回答

1

試試這個,一個應該子句兩個條件

{ 
    "query": { 
     "bool": { 

      "should": [ 
       { 
        "nested": { 
         "path": "tags", 
         "query": { 
          "bool": { 
           "must": [ 
            { 
             "match": { 
              "tags.t": "tagC" 
             } 
            } 
           ] 
          } 
         } 
        } 
       }, 
       { 
        "bool": { 
         "must": [ 
          { 
           "term": { 
            "active": true 
           } 
          }, 
          { 
           "nested": { 
            "path": "tags", 
            "query": { 
             "bool": { 
              "must": [ 
               { 
                "match": { 
                 "tags.t": "tagB" 
                } 
               } 
              ] 
             } 
            } 
           } 
          } 
         ] 
        } 
       } 
      ] 
     } 
    } 
}