elasticsearch 必须 OR must_not

elasticsearch must OR must_not

我的 elasticsearch 请求有这个查询:

{
    "query": {
        "bool": {
            "filter": {
                "bool": {
                    "should" : [
                        {                
                            "bool" : {
                                "must_not": {
                                    "exists": {
                                        "field": "visibility_id"
                                    }
                                }
                            }
                        },
                        {
                            "bool" : {
                                "must": {
                                    "terms": {
                                        "visibility.visibility": ["visible"]
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}

目标是检查 visibility_id 行是否在 table 中。如果不是,它将 return true 到达“must_not”。但是,如果存在 visibility_id 列,则需要检查它是否设置为“可见”。

目前,如果 visibility_idnull,它可以工作,但它不会检查 termsterms 可以是除 visible 之外的任何其他内容,它会起作用。

有人可以帮助我吗,我是 elasticsearch 的新手。 (我尝试过不使用过滤器 bool,只使用 should 但它也不起作用。)

试试这个查询,你遗漏了 minimum_should_match: 1

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "must_not": {
              "exists": {
                "field": "visibility_id"
              }
            }
          }
        },
        {
          "terms": {
            "visibility.visibility": [
              "visible"
            ]
          }
        }
      ]
    }
  }
}

如果 visibility 在您的映射中是 nested,您的查询需要改为这样:

{
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "must_not": {
              "exists": {
                "field": "visibility_id"
              }
            }
          }
        },
        {
          "nested": {
            "path": "visibility",
            "query": {
              "terms": {
                "visibility.visibility": [
                  "visible"
                ]
              }
            }
          }
        }
      ]
    }
  }
}