Elasticsearch嵌套查询的问题&日期计算

时间:2016-02-10 12:31:16

标签: elasticsearch

我在编写查询以查询具有活动事件的用户时遇到问题。

简短设置是我的用户拥有包含开始日期和结束日期的活动。鉴于具体日期,我需要知道当天哪些用户没有活动事件。事件被编入索引为嵌套对象,因为它们有自己的模型。

所以这里有一些数据

[
  {
    id: 1
    name: 'MyUser',
    events :[
       { id: 1, start: 02/01/2016, end: 02/05/2016 },
       { id: 2, start: 02/09/2016, end: 02/10/2016 },
    ]
  },
  {
    id: 2
    name: 'MyUser2',
    events :[
       { id: 3, start: 02/02/2016, end: 02/04/2016 },
    ]
  },
  {
    id: 3
    name: 'MyUser3',
    events :[
    ]
  }
]

地图看起来像这样

 'events' => [
            'type'=>'nested',
            'properties'=>[
                'start'=>[
                    'type' => 'date',
                    "format"=> "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
                ],
                'end'=>[
                    'type' => 'date',
                    "format"=> "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
                ]
            ]
        ],

因此,对于02/08/2016的示例查询,我需要向所有用户免费显示,02/04/2016仅限用户3,而02/08/2016仅显示用户1和3

我的查询目前看起来像这样

{
    "filtered": {
        "filter": {
            "bool": {
                "should": [{
                    "term": {
                        "events_count": 0
                    }
                }, {
                    "nested": {
                        "path": "events",
                        "query": {
                            "bool": {
                                "must_not": [{
                                    "range": {
                                        "events.start": { 
                                          "lte" : "2016-02-08"
                                        }
                                    }
                                }, {
                                    "range": {
                                        "events.end": {
                                            "gte": "2016-02-08"
                                        }
                                    }
                                }]
                            }
                        }
                    }
                }]
            }
        }
    }
}

我将events_count分开索引因为我已经放弃了混合缺失的嵌套对象,它只是没有按预期工作

实际问题:

所以问题就在于用户试图将开始日期和结束日期匹配在一起,目前User1正在匹配起始标准lte $ search_date,当它不应该时。

我试图写的逻辑是WHEN events.start< $ search_date AND events.end> $ search_date,认为它是一个匹配。

实际上发生的事情似乎是它评估了开始&结束逻辑作为单独的逻辑,因此如果开始< $ search_date,即使.end< $ search_date它认为它是一个匹配。

1 个答案:

答案 0 :(得分:0)

您需要将范围查询包装在另一个bool查询和必须子句(相当于SQL AND)中。 must_not将排除所有符合任何查询的文档

所以而不是

must_not => range_queries

像这样:

must_not => bool => must => range_queries