我想根据centerIdcourseIdbatchId搜索学生。例如我有如下学生数据。

{
"s1":{
"name":alex,
"centerId":"N001",
"courseId":"ncjava",
"batchId":"nb1"},

"s2":{
"name":John,
"centerId":"N001",
"courseId":"nc02",
"batchId":"ncb2"},

"s3":{
"name":David,
"centerId":"N001",
"courseId":"ncjava",
}
}

现在我想搜索centerIdcourseIdbatchId匹配的学生,甚至想要具有centerIdcourseId匹配但缺少batchId的学生。我写下面的查询
{
"query": {
    "bool": {"must": [
     {
    "match": {
        "centerId":"N001"
    }},
    { "match": {
       "courseId": "ncjava"
    }}
    ],
        "should":[
            {
        "match": {
           "batchId": "nb1"
        }
    }
    ]
    }
}

}

该查询返回与centerIdcourseId匹配的所有学生。但这也会让我返回具有不同“batchId”的学生。我只希望batchId匹配或不存在时才是学生。

最佳答案

您可以添加查询词“ bool(boolean) ”,以使逻辑“或”符合您的需要。 batchId = X OR batchId is missing可以用should表达式表示(而batchId is missing可以用must_notexists表示),如下所示:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "centerId": "N001"
          }
        },
        {
          "match": {
            "courseId": "ncjava"
          }
        },
        {
          "bool": {
            "minimum_should_match": 1,
            "should": [
              {
                "match": {
                  "batchId": "nb1"
                }
              },
              {
                "bool": {
                  "must_not": {
                    "exists": {
                      "field": "batchId"
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

您可以将must视为“and”,将should视为“or”(尽管比boolean or更灵活),而must_not则视为 bool(boolean) “not”。因此,以上查询的含义类似于centerId == N001 AND courseId == ncjava AND (batchId == nb1 OR NOT exists batchId)

在这种特定的上下文中,实际上不需要minimum_should_match(默认行为已经是您想要的),但是由于该行为在不同的上下文中有所不同,因此我希望明确地包含它,以防在查询中以意外方式编辑 future (尽管上下文已更改,但should的行为将保持不变)。 minimum_should_match为1意味着should子句中的至少1个必须匹配。

这是这些组件中每个组件的文档:

bool query
exists query
minimum_should_match

07-24 13:15