2015-10-29 47 views
0

我有一個文檔,其中包含學生和每個學生的成績。它看起來是這樣的:一個Elasticsearch過濾器來確定缺少值

"name": "bill", 
"year": 2015, 
"grades": [ 
    {"subject": "math", grade: "A"}, 
    {"subject": "english", grade: "B"} 
    ], ... 

我在尋找查詢過濾器(S),可以給我:

  • 誰研究的數學「的學生名單,並
  • 一學生誰有不是學習'數學'。

我在想,一個存在過濾器應該這樣做,但我努力讓我的頭周圍。


這是一個程式化的例子,但該映射是這樣的:

"mappings": { 
    "student": { 
     "properties": { 
      "name": { 
       "type": "string" 
      }, 
      "grades": { 
       "type": "nested", 
       "properties": { 
       "subject": { 
        "type": "string" 
       }, 
       "grade": { 
        "type": "string" 
       } 
       } 
      } 
     } 
    } 
    } 
+0

難道您發佈索引映射? –

+0

@EvaldasBuinauskas - 添加映射。 – pheobas

回答

0

一個term filter應該做的很好。對於反向查詢,只需用not filter否定它:

"query": 
{ 
    "filtered" : { 
     "query": { 
      "match_all": {} 
     }, 
     "filter" : { 
      "term": { 
       "grades.subject": "math" 
      } 
     } 
    } 
} 

而對於誰沒有學習數學的那些:

"query": 
{ 
    "filtered" : { 
     "query": { 
      "match_all": {} 
     }, 
     "filter" : { 
      "not": { 
       "filter": { 
        "term": { 
         "grades.subject": "math" 
        } 
       } 
      } 
     } 
    } 
} 
+0

這將工作在成績是一個單一的對象,但在我的情況下,成績是一個數組。 – pheobas

+0

@pheobas你試過了嗎?我很肯定它的工作原理,除非我誤解了你的問題。我們有幾乎相同的案例(工作陣列,行業註釋)。 – Slomo

+0

這工作。我的問題是我的映射將檔次子文檔映射爲「嵌套」類型,這會影響文檔的查詢方式。需要現在閱讀... – pheobas

1

你需要改變一點你的映射和,取決於你的需要,我建議聚合

首先,你的nested對象必須"include_in_parent": true,這樣你可以很容易做到的not studied 'math'部分:

PUT /grades 
{ 
    "mappings": { 
    "student": { 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "grades": { 
      "type": "nested", 
      "include_in_parent": true, 
      "properties": { 
      "subject": { 
       "type": "string" 
      }, 
      "grade": { 
       "type": "string" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

而完整的查詢,使用聚合:

GET /grades/student/_search?search_type=count 
{ 
    "aggs": { 
    "studying_math": { 
     "filter": { 
     "nested": { 
      "path": "grades", 
      "query": { 
      "filtered": { 
       "filter": { 
       "bool": { 
        "must": [ 
        { 
         "term": { 
         "grades.subject": "math" 
         } 
        } 
        ] 
       } 
       } 
      } 
      } 
     } 
     }, 
     "aggs": { 
     "top_10": { 
      "top_hits": { 
      "size": 10 
      } 
     } 
     } 
    }, 
    "not_studying_math": { 
     "filter": { 
     "bool": { 
      "must_not": [ 
      { 
       "term": { 
       "grades.subject": "math" 
       } 
      } 
      ] 
     } 
     }, 
     "aggs": { 
     "top_10": { 
      "top_hits": { 
      "size": 10 
      } 
     } 
     } 
    } 
    } 
}