2017-01-25 37 views
0

我使用ES 2.3和有一個查詢中filter部分看起來如下:Elasticsearch:對嵌套文件執行過濾器,只有當它存在

"filter": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "bool": { 
        "must": [ 
        { 
         "range": { 
         "employees.max_age": { 
          "lte": 50 
         } 
         } 
        }, 
        { 
         "range": { 
         "employees.min_age": { 
          "gte": 20 
         } 
         } 
        } 
        ] 
       } 
       } 
      } 
      }, 
      { 
      "exists": { 
       "field": "employees" 
      } 
      }, 
      { 
      #....other filter here based on root document, not on nested employee document 
      } 
     ] 
     } 
    } 
    } 
} 

我有一個過濾器,在這裏我檢查在某些條件下嵌套的文檔「僱員」在一個更大的文檔中稱爲company,但是我想運行這個過濾器,只有當「employees」對象存在時,因爲某些文檔可能根本沒有嵌套文檔。所以我補充說,{"exists": {"field": "employees"}} 但這似乎並不奏效。任何想法我應該做些什麼改變才能奏效?

+0

你需要移動'nested'查詢裏面的'exists'查詢,也將努力 – Val

+0

@val可以請你告訴我在哪裏,我應該正好把它? – JVK

+0

另外,如果你把它放在'nested'裏面,那麼你已經假設嵌套已經存在,那麼只有它會遍歷? – JVK

回答

0

你可以這樣做。但是,如果文檔沒有employees字段,它們將不會被拾取,因此我不確定爲什麼您首先需要/需要查詢exists

{ 
    "filter": { 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "exists": { 
        "field": "employees" 
       } 
       } 
      } 
      }, 
      { 
      "nested": { 
       "path": "employees", 
       "query": { 
       "bool": { 
        "must": [ 
        { 
         "range": { 
         "employees.max_age": { 
          "lte": 50 
         } 
         } 
        }, 
        { 
         "range": { 
         "employees.min_age": { 
          "gte": 20 
         } 
         } 
        } 
        ] 
       } 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 
} 
+0

謝謝@val我會試試這個,並會讓你知道。關於「然而,如果文件沒有僱員領域,他們不會被拿起來,所以我不知道爲什麼你想/需要存在的查詢擺在首位。」 - 因爲我想包含這些文件,即使在「僱員」不存在的情況下也是如此。我想要的是當且僅當'僱員'存在,然後只運行過濾器。 – JVK

+0

在這種情況下,它取決於您的整體查詢的樣子,我們將看到。 – Val