Elasticsearch嵌套doc与AND条件

时间:2016-07-13 17:31:07

标签: elasticsearch

ES方案我们为学生文档建模,其中包含多个嵌套课程文档。我想搜索有X和Y课程的学生。

映射:

{
  "index_classroom": {
    "mappings": {
      "content": {
        "dynamic": "false",
        "properties": {
          "courses": {
            "type": "nested",
            "properties": {
              "grade": {
                "type": "integer"
              },
              "name": {
                "type": "string",
                "analyzer": "analyzer_keyword"
              }
            }
          }
        }
       } 
     }
    }
   }

示例文档:

{
    "_index": "index_classroom",
    "_type": "content",
    "_id": "6170_130",
    "_score": 0.72833073,
    "_source": {
      "courses": [
        {
          "name": "maths",
          "grade": "A" 
        },
        {
          "name": "economics",
          "grade": "A+"
        }
      ]
    }
  }

我想查询所有学过数学和经济学的学生(进一步补充的是“而不是生物学”。)

谢谢!

1 个答案:

答案 0 :(得分:2)

这是您的查询:

{
    "query": {
        "bool": {
            "must": [
                {
                    "nested": {
                        "path": "courses",
                        "query": { 
                            "match": {
                                "courses.name": "economics"
                            }
                        }
                    }
                },
                {
                    "nested": {
                        "path": "courses",
                        "query": {
                            "match": {
                                "courses.name": "maths"
                            }
                        }
                    }
                }
            ],
            "must_not": [
                {
                    "nested": {
                        "path": "courses",
                        "query": {
                            "match": {
                                "courses.name": "Biology"
                            }
                        }
                    }
                }
            ]
        }
    }
}