2016-11-20 3 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" 
        } 
        } 
       ] 
       } 
      } 
      } 
     } 
    ] 
    } 
    } 
} 

для вышеуказанного, книга1 и книга2 возвращен.

, но то, что я пытаюсь получить сейчас, усложняется. Я пытаюсь получить «активные» книги с определенным тегом (tagB). но если «tagC» находится в книге, тогда книга может вернуться также, если она не активна.

поэтому для этого вопрос, книга1, книга2, книга3 вернется.

как я могу сделать этот запрос в 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" 
                } 
               } 
              ] 
             } 
            } 
           } 
          } 
         ] 
        } 
       } 
      ] 
     } 
    } 
}