Elasticsearch按日期范围和其他字段过滤

时间:2019-10-31 10:38:31

标签: elasticsearch

我查询了按日期和其他字段对数据进行分组的查询,我想按日期和电子邮件范围进行过滤,我尝试了仅过滤日期,并且在应用了电子邮件查询后也有效,但是也可以显示所有数据。 这是我的查询看起来像:

{
                    "_source": ["user_email","shipping_address.zipcode","eventtime"],
                    "query" : {
                        "bool":{
                            "filter": {
                                "range": {
                                    "eventtime":{
                                        "gt": start_date,
                                        "lt": end_date
                                    }
                                }
                            },
                            "should":{
                                "match_phrase_prefix" : {
                                    "user_email": "christea2045@yahoo.com"
                                }
                            }
                        }
                    },                    
                    "aggs": {
                        "group_by_date":{
                            "date_histogram":{
                                "field" : "eventtime",
                                "interval" : "1d"
                            },

                            "aggs":{
                                "group_shipzip":{
                                    "terms":{
                                        "field": "shipping_address.zipcode.keyword"
                                    }
                                }
                            }
                        }

                    }
                }

1 个答案:

答案 0 :(得分:0)

您需要在must子句中添加范围和电子邮件

 "must": [
            {
               "range": {
                           "eventtime":{
                                        "gt": start_date,
                                        "lt": end_date
                                    }
                                }
                            },
                            {
                              "match_phrase_prefix": {
                                                     "user_email": "abc1@yahoo.com"
                                                    }
                            }
                          ]

在您的查询中,只有过滤器部分正在返回结果。由于电子邮件位于should子句中,即使没有匹配项,它也会返回文档。

如果您要在user_email上进行全文匹配,则最好在关键字字段上使用术语查询

{
          "term": {
            "user_email.keyword": {
              "value": "abc1@yahoo.com"
            }
          }
  }
``