Elasticsearch 查询,其中 returns 所有内容或找到的匹配项

Elasticsearch query, which returns either everything or the found hits

我可以将可选参数传递给我的 es-query。如果没有传递参数,es-query 应该简单地 return 不考虑参数过滤器的所有内容。

到目前为止我得到了什么:

{
    "query": {
      "bool": {
          "must": [
            {
              "terms": {
                "person": [
                  "donald trump",
                  "bernie sanders"
                ]
              }
            },
            {
              "range": {
                "date": {
                  "gte": "now-7d",
                  "lte": "now"
                }
              }
            }
          ],
          "should": {
            "terms": {
              "source_name": [
                "nytimes.com"
              ]
            }
          }
        }
    }
}

source_name 字段应该是可选的,这意味着如果我将发布者作为参数传递,那么它应该 return 它发现的任何内容,如果没有传递发布者参数,那么它应该忽略 source_name 简单地 return 一切。

我怎样才能做到这一点?

Elastic search DSL 是声明式语言,因此无法使用 if else 逻辑(控制流)。您不应在创建查询本身时添加子句(如果输入为空)。 或者您可以使用 minimum_should_match。在这两种情况下,您都需要更改用于生成弹性搜索查询的语言

查询:

{
"query": {
  "bool": {
  "must": [
    {
      "terms": {
        "person": [
          "donald trump",
          "bernie sanders"
        ]
      }
    },
    {
      "range": {
        "date": {
          "gte": "now-7d",
          "lte": "now"
        }
      }
    }
  ],
  "should": {
    "terms": {
      "source_name": [
        "nytimes.com"
      ]
    }
  }, 
"minumum_should_match":1 --> 0 if input is empty
}
}
}