我想根据centerId
,courseId
和batchId
搜索学生。例如我有如下学生数据。
{
"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",
}
}
现在我想搜索
centerId
,courseId
和batchId
匹配的学生,甚至想要具有centerId
和courseId
匹配但缺少batchId
的学生。我写下面的查询{
"query": {
"bool": {"must": [
{
"match": {
"centerId":"N001"
}},
{ "match": {
"courseId": "ncjava"
}}
],
"should":[
{
"match": {
"batchId": "nb1"
}
}
]
}
}
}
该查询返回与
centerId
和courseId
匹配的所有学生。但这也会让我返回具有不同“batchId”的学生。我只希望batchId
匹配或不存在时才是学生。 最佳答案
您可以添加查询词“ bool(boolean) ”,以使逻辑“或”符合您的需要。 batchId = X OR batchId is missing
可以用should表达式表示(而batchId is missing
可以用must_not
和exists
表示),如下所示:
{
"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