Elasticsearch:根据日期范围过滤结果

时间:2019-09-21 19:01:45

标签: elasticsearch

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

我确实使用了should表达式,但不幸的是它会基于日期范围从Elasticsearch中提取所有记录,即甚至从project_date 2019-01-01中提取其他员工信息。

{

  "query": {

    "bool": {

      "should": [

        { "match": { "email_address":   "annie@test.com"        }},

        { "match": { "email_address":   "chalavadi@test.com"        }}

      ],

      "filter": [

        { "range": { "project_date": { "gte": "2019-08-01" }}}

      ]

    }

  }

}

我也尝试过必须表达但没有结果。您能帮我使用日期范围内的email_address查找员工吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用termsrange以及filter中现有的查询,以更短的方式进行操作。由于should子句,您现有的查询无法正常工作,这使您的filter较弱。 在此处了解更多信息

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

{
 "query": { 
 "bool": { 
   "filter": [ 
     {
          "terms": {
            "email_address.keyword": [
              "annie@test.com", "chalavedi@test.com"
            ]
          }
      },
      {
          "range": {
            "project_date": {
              "gte": "2019-08-01"
            }
          }
       }
    ]
   }
  }
}

答案 1 :(得分:0)

应(或)子句是可选的

引用this文章。 “在查询中,如果存在必须查询和过滤器查询,则应查询应该会影响分数。但是,如果布尔查询处于过滤器上下文中,或者既没有必须查询也没有过滤器查询,则至少应有一个查询查询必须与文档匹配。”

因此,在您的查询中,仅应影响分数,而不实际过滤文档。您必须将must包装在must中,或将其移动到过滤器中(如果不需要评分)。

GET employeeindex/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "projectdate": {
            "gte": "2019-01-01"
          }
        }
      },
      "must": [
        {
          "bool": {
            "should": [
              {
                "term": {
                  "email.raw": "abc@text.com"
                }
              },
              {
                "term": {
                  "email.raw": "efg@text.com"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

您也可以使用@AlwaysSunny的答案中的条款子句替换should子句。