尝试过滤出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"
]
}
答案 0 :(得分:0)
您应将SUBJECT_RESULT.SUBJECT_ID
和SUBJECT_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"
]
}