我在编写查询以查询具有活动事件的用户时遇到问题。
简短设置是我的用户拥有包含开始日期和结束日期的活动。鉴于具体日期,我需要知道当天哪些用户没有活动事件。事件被编入索引为嵌套对象,因为它们有自己的模型。
所以这里有一些数据
[
{
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它认为它是一个匹配。
答案 0 :(得分:0)
您需要将范围查询包装在另一个bool查询和必须子句(相当于SQL AND)中。 must_not将排除所有符合任何查询的文档
所以而不是
must_not => range_queries
像这样:
must_not => bool => must => range_queries