我想根据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
1}}丢失了。我在下面写了一下查询
{
"query": {
"bool": {"must": [
{
"match": {
"centerId":"N001"
}},
{ "match": {
"courseId": "ncjava"
}}
],
"should":[
{
"match": {
"batchId": "nb1"
}
}
]
}
}
}
此查询会向我返回与centerId
和courseId
匹配的所有学生。但它也让我的学生有了不同的'batchId'。我只希望学生在batchId
匹配或不存在时使用。
答案 0 :(得分:1)
您可以添加“bool”的查询字词,以便按照您的意愿制作“或”逻辑。 $(document).ready(function(){
// code
$(".search").on('keyup change' , function(){
// same code
});
});
可以使用should表达式(batchId = X OR batchId is missing
包含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
喜欢“或”(虽然比布尔或更灵活),而should
则是布尔“不”。因此,上述查询意味着类似must_not
。
在这个特定的上下文中,centerId == N001 AND courseId == ncjava AND (batchId == nb1 OR NOT exists batchId)
实际上不是必需的(默认行为已经是你想要的),但由于不同上下文中的行为不同,我想明确地包含它,以防查询将来会以意想不到的方式进行编辑(然后minimum_should_match
的行为将保持不变,尽管上下文已更改)。 should
为1意味着minimum_should_match
个条款中至少有一个必须匹配。
以下是每个组件的文档: