当前位置: 首页 > 面试题库 >

Elasticsearch-布尔过滤器:日期范围或字段可以为空

高峻
2023-03-14
问题内容

我正在尝试在ElasticSearch中创建一个 布尔过滤器
,以检查start_dateend_date与今天进行比较。如果start_dateend_date为null,则仍应返回结果。

例如,今天是2016-08-09。

  • 项目1 :起始日期:2016年8月4日END_DATE:2016年8月8日 不应该被返回
  • 项目2 :起始日期:2016年8月8日END_DATE:2016年8月12日 应返回
  • 项目3 :开始日期:null结束日期:null 应该返回

似乎无法使其与我当前的代码配合使用:

POST _search
{
"query":{
    "filtered": {
        "query": {
            "match_all": {}
        },
        "filter" : {
            "bool": {
                "must": [{
                    "range": {
                        "start_date": {"lte": "2016-08-09"}         
                    }
                },
                {
                    "range": {
                        "end_date": {"gte": "2016-08-09"}     
                    }
                }],
                "should": [{
                    "missing": {
                        "field": "start_date"         
                    }
                },
                {
                    "missing": {
                        "field": "end_date"      
                    }
                }]
            }
        }
    }
}
}

问题答案:

您可能需要这样的东西,即:

  • start_date 必须为null或今天之前
  • end_date 必须为null或今天之后

修改后的查询:

POST _search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "bool": {
                "should": [
                  {
                    "range": {
                      "start_date": {
                        "lte": "now"
                      }
                    }
                  },
                  {
                    "missing": {
                      "field": "start_date"
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "should": [
                  {
                    "range": {
                      "end_date": {
                        "gte": "now"
                      }
                    }
                  },
                  {
                    "missing": {
                      "field": "end_date"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}


 类似资料:
  • 我正在使用弹性搜索。我以前从未使用过的网络NEST客户端。我想做的是在得分前按日期范围过滤结果。 我使用对象初始值设定项语法,因为它最适合我。 我已经完成了我想要的: 这给了我一个JSON请求,就像我期望的那样: 但留档过滤查询说"弃用在2.0.0-beta1.改为使用bool查询,查询的必须子句和筛选器子句”。 因为这是我发现的唯一包含过滤器的方法,有没有更好的方法来使用嵌套对象初始值设定项语法

  • 目前,我已经知道如何从(时间戳)日期字段中筛选日期范围。这是一个简单的问题: 但是,当你对基于时间的范围感兴趣时,如何过滤日期,比如gte:“8:00:00”和lte:“10:00:00”?这有可能吗? 换句话说,我的要求是:如何让所有事件在本月(15-11-01/15-11-30)发生,但只能在上午8:00到10:00之间发生?

  • 问题内容: 我正在使用Elasticsearch 6.6,尝试根据在日期范围内传递给查询(Bool)的多个值(email_address)提取多个结果/记录。例如:我想根据他们的email_address(annie@test.com,charles@test.com,heman@test.com)以及时期(即project_date(2019-01-01))提取有关少数雇员的信息。 我确实使用了

  • 问题内容: 我有一个包含整数数组的字段,例如: 我想过滤结果,以使价格至少包含介于以下之间的值列表之一: 由于价格字段中的`[20002,30000] 问题答案: Elasticsearch始终认为字段可以包含值列表,因此,范围过滤器应该起作用。如果任何值与范围匹配,它将被过滤。 您可以将该过滤器用作过滤查询的一部分: 但是,过滤查询在2.0中已弃用,因此,如果您使用的是2.0,则最好将布尔查询与

  • 我从事elasticsearch,我尝试混合两个工作查询。第一个是“and filter”,第二个是“bool filter”,但我失败了。 我的查询是从用户交互界面动态生成的。 “和过滤器”: 我需要“和过滤器”来查询数据,例如,字段必须等于“非洲”或“亚洲”或为空。这是一个工作查询的示例: 此查询工作正常,结果如下: 现在我需要用字段“D\u TYPESTATUS”来限制结果数据,该字段必须与

  • 我在ES中有两个问题。对于同一组文档,两者的周转时间都不同。两者在概念上都在做同样的事情。我没有什么疑问 1-这两者之间有什么区别?2-哪个更好使用?3-如果两者相同,为什么表现不同? 映射: 更新1: 我在同一组数据上尝试了bool/必须查询和bool/过滤器查询,但我发现了奇怪的行为 1-bool/必须查询能够搜索所需的文档 2-虽然bool/filter无法搜索文档。如果我删除第二个字段条件