一个Elasticsearch过滤器,用于确定缺少值

时间:2015-10-29 13:08:24

标签: elasticsearch

我有一份文件,其中包含每个学生的学生和成绩。它看起来像这样:

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

我正在寻找可以提供给我的查询过滤器:

  • 已经学过数学'和
  • 的学生名单
  • 学习数学的学生名单

我认为存在过滤器应该这样做,但我很难理解它。

这是一个程式化的例子,但映射是这样的:

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

2 个答案:

答案 0 :(得分: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
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

io()应该没问题。对于反向查询,只需使用term filter

取消它
not filter

对于那些不学习数学的人:

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