即使弹性搜索中缺少某些字段,也会搜索文档

时间:2017-10-12 11:13:20

标签: elasticsearch

我想根据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 1}}丢失了。我在下面写了一下查询

{
"query": {
    "bool": {"must": [
     {
    "match": {
        "centerId":"N001"
    }},
    { "match": {
       "courseId": "ncjava"
    }}
    ],
        "should":[
            {
        "match": {
           "batchId": "nb1"
        }
    }
    ]
    }
}

}

此查询会向我返回与centerIdcourseId匹配的所有学生。但它也让我的学生有了不同的'batchId'。我只希望学生在batchId匹配或不存在时使用。

1 个答案:

答案 0 :(得分:1)

您可以添加“bool”的查询字词,以便按照您的意愿制作“或”逻辑。 $(document).ready(function(){ // code $(".search").on('keyup change' , function(){ // same code }); }); 可以使用should表达式(batchId = X OR batchId is missing包含batchId is missingmust_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个条款中至少有一个必须匹配。

以下是每个组件的文档:

bool query
exists query
minimum_should_match