过滤具有内部匹配项的对象列表

时间:2019-09-10 00:19:09

标签: elasticsearch

尝试过滤出Elasticsearch中的对象列表

假设我具有以下结构来映射包含两个对象的结果状态

"SUBJECT_RESULT": [
            {
              "RESULT_STATUS": 101,
              "SUBJECT_ID": 194,
              "PERCENTAGE": 90
            },
            {
              "RESULT_STATUS": 102,
              "SUBJECT_ID": 19,
              "PERCENTAGE": "89"
            }
          ],
"STUDENT_ID": "123",
"CLASS_ID": "12"

"SUBJECT_RESULT": [
            {
              "RESULT_STATUS": 101,
              "SUBJECT_ID": 19,
              "PERCENTAGE": 90
            },
            {
              "RESULT_STATUS": 102,
              "SUBJECT_ID": 194,
              "PERCENTAGE": "95"
            }
          ],
"STUDENT_ID": "126",
"CLASS_ID": "12"

我想过滤主题ID为19且结果状态为101的学生,因此预期输出为

"SUBJECT_RESULT": [
            {
              "RESULT_STATUS": 101,
              "SUBJECT_ID": 19,
              "PERCENTAGE": 90
            }
          ],
"STUDENT_ID": "126"

当前输出为

"SUBJECT_RESULT": [
            {
              "RESULT_STATUS": 101,
              "SUBJECT_ID": 194,
              "PERCENTAGE": 90
            },
            {
              "RESULT_STATUS": 102,
              "SUBJECT_ID": 19,
              "PERCENTAGE": "89"
            }
          ],
"STUDENT_ID": "123"

"SUBJECT_RESULT": [
            {
              "RESULT_STATUS": 101,
              "SUBJECT_ID": 19,
              "PERCENTAGE": 90
            },
            {
              "RESULT_STATUS": 102,
              "SUBJECT_ID": 194,
              "PERCENTAGE": "95"
            }
          ],
"STUDENT_ID": "126"

下面是我尝试过的弹性查询,它为我提供了上述输出

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must": [
              {
                "terms": {
                  "CLASS_ID": [
                    "12"
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "nested": {
                        "path": "SUBJECT_RESULT",
                        "query": [
                          {
                            "terms": {
                              "SUBJECT_RESULT.SUBJECT_ID": [
                                "19"
                              ]
                            }
                          },
                          {
                            "terms": {
                              "SUBJECT_RESULT.RESULT_STATUS": [
                                "101"
                              ]
                            }
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  },
  "size": 5,
  "from": 0,
  "_source": [
    "STUDENT_ID",
    "SUBJECT_RESULT"
  ]
}

1 个答案:

答案 0 :(得分:0)

您应将SUBJECT_RESULT.SUBJECT_IDSUBJECT_RESULT.RESULT_STATUS的{​​{1}}查询包装在filter查询的must / bool子句中。其次,由于SUBJECT_RESULT是嵌套对象,因此您应在嵌套查询中添加inner_hits以获取匹配的嵌套文档,并从_source中删除“ SUBJECT_RESULT”,因为它将返回所有嵌套文档用于匹配父文档。 下面是必需的查询:

{
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must": [
              {
                "terms": {
                  "CLASS_ID": [
                    "12"
                  ]
                }
              },
              {
                "bool": {
                  "must": [
                    {
                      "nested": {
                        "path": "SUBJECT_RESULT",
                        "inner_hits":{},
                        "query": {
                          "bool": {
                            "must": [
                              {
                                "terms": {
                                  "SUBJECT_RESULT.SUBJECT_ID": [
                                    "19"
                                  ]
                                }
                              },
                              {
                                "terms": {
                                  "SUBJECT_RESULT.RESULT_STATUS": [
                                    "101"
                                  ]
                                }
                              }
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  },
  "size": 5,
  "from": 0,
  "_source": [
    "STUDENT_ID"
  ]
}