【问题标题】:Search document even when some fields are missing in elastic search即使弹性搜索中缺少某些字段,也可以搜索文档
【发布时间】:2017-10-13 15:17:12
【问题描述】:

我想根据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 匹配或不存在时,我只想要学生。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您可以添加“bool”的查询词,以便按照您的意愿制作“或”逻辑。 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 视为“与”,将should 视为“或”(尽管比布尔或更灵活),将must_not 视为布尔“非”。所以,上面的查询意味着类似centerId == N001 AND courseId == ncjava AND (batchId == nb1 OR NOT exists batchId)

    在这个特定的上下文中,minimum_should_match 实际上不是必需的(默认行为已经是您想要的),但由于在不同的上下文中行为不同,我喜欢明确地包含它,以防查询被编辑在未来以一种意想不到的方式(然后should 的行为将保持不变,尽管上下文发生了变化)。 minimum_should_match of 1 表示至少有 1 个 should 子句必须匹配。

    以下是每个组件的文档:

    bool query
    exists query
    minimum_should_match

    【讨论】:

    • 对不起@dshockley 你的查询给了我这个例外[must] query malformed, no start_object after query name
    • 我做了必要的更改,现在工作正常。你能解释一下上面的查询吗
    • 为什么使用"minimum_should_match": 1
    • 很抱歉,我错过了一个布尔值。我已更新以解决该问题,并更新了答案并提供了更多解释。
    猜你喜欢
    • 2013-09-16
    • 2016-01-12
    • 2013-08-15
    • 1970-01-01
    • 2015-06-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多