如何根据溢出的时间范围过滤弹性搜索文档?
How to filter elastic search document based on overflowing hour range?
我有一个餐厅索引,它有一个包含 dayOfWeek、opening_hour 和 closing_hour hour_range(HH:mm:ss) 的嵌套字段。
"hours": { "type": "nested" ,
"properties": {
"day_of_week": {
"type": "short"
},
"opening_hour": {
"type": "date",
"format": "strict_hour_minute_second"
},
"closing_hour": {
"type": "date",
"format": "strict_hour_minute_second"
},
"restaurant_id": {
"type": "integer"
}
}
},
我的要求是一家餐厅可以营业到第二天,这意味着一家餐厅的营业时间小于关闭时间是有效的(例如:22:00:00 - 02:00:00)
根据该要求,由于上述原因,我将无法使用弹性搜索日期范围字段类型,因此必须为开始时间和结束时间设置单独的字段。
现在,根据上面的映射,我如何查询某个时间范围是否在开市时间和闭市时间之间?
示例:
Opening Hour Start Range End Range Closing Hour
1.Normal case 03:00 04:00 09:00 10:00
2.Overflowing opening hour 23:00 01:00 03:00 10:00
3.Overflowing closing hour 03:00 04:00 22:00 02:00
4.Overflowing range 22:00 23:00 03:00 04:00
以上四种情况均有效,应退回文件。
在#1 和#4 的情况下,我只需找到小于等于 startRange 的开放时间和大于等于 endRange 的关闭时间
现在情况#2 和#3 需要我比较 openingHour 和 startRange 或 closingHour 和 endRange 并相应地修改查询。两者都需要我访问索引值 openingHour 和 closingHour。
我想到了通过脚本查询应用逻辑。但是,我意识到在过滤器上下文中
https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-filter-context.html
_source 不可用,只有禁止我们访问嵌套字段的文档值。
一种选择是将开放时间分成基于星期几的 OH。所以 hours_day_of_week_1
、hours_day_of_week_2
等。这样,您就不再需要 nested
数据类型,并且可以从脚本查询中访问所有内容。
由于似乎没有简单直接的方法来存储超过 2 天的小时范围,我又添加了一个整数范围类型的字段 hour_range 来解决问题。这样,如果结束范围低于开始范围,我可以通过添加额外的一天轻松区分溢出日期的范围。
例如,范围:23:00 - 03:00 将存储为 82800 - 97200,表示一天中的秒数
范围:01:00 - 05:00 将存储为 3600 - 18000
我有一个餐厅索引,它有一个包含 dayOfWeek、opening_hour 和 closing_hour hour_range(HH:mm:ss) 的嵌套字段。
"hours": { "type": "nested" ,
"properties": {
"day_of_week": {
"type": "short"
},
"opening_hour": {
"type": "date",
"format": "strict_hour_minute_second"
},
"closing_hour": {
"type": "date",
"format": "strict_hour_minute_second"
},
"restaurant_id": {
"type": "integer"
}
}
},
我的要求是一家餐厅可以营业到第二天,这意味着一家餐厅的营业时间小于关闭时间是有效的(例如:22:00:00 - 02:00:00)
根据该要求,由于上述原因,我将无法使用弹性搜索日期范围字段类型,因此必须为开始时间和结束时间设置单独的字段。
现在,根据上面的映射,我如何查询某个时间范围是否在开市时间和闭市时间之间?
示例:
Opening Hour Start Range End Range Closing Hour
1.Normal case 03:00 04:00 09:00 10:00
2.Overflowing opening hour 23:00 01:00 03:00 10:00
3.Overflowing closing hour 03:00 04:00 22:00 02:00
4.Overflowing range 22:00 23:00 03:00 04:00
以上四种情况均有效,应退回文件。
在#1 和#4 的情况下,我只需找到小于等于 startRange 的开放时间和大于等于 endRange 的关闭时间
现在情况#2 和#3 需要我比较 openingHour 和 startRange 或 closingHour 和 endRange 并相应地修改查询。两者都需要我访问索引值 openingHour 和 closingHour。
我想到了通过脚本查询应用逻辑。但是,我意识到在过滤器上下文中 https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-filter-context.html
_source 不可用,只有禁止我们访问嵌套字段的文档值。
一种选择是将开放时间分成基于星期几的 OH。所以 hours_day_of_week_1
、hours_day_of_week_2
等。这样,您就不再需要 nested
数据类型,并且可以从脚本查询中访问所有内容。
由于似乎没有简单直接的方法来存储超过 2 天的小时范围,我又添加了一个整数范围类型的字段 hour_range 来解决问题。这样,如果结束范围低于开始范围,我可以通过添加额外的一天轻松区分溢出日期的范围。
例如,范围:23:00 - 03:00 将存储为 82800 - 97200,表示一天中的秒数
范围:01:00 - 05:00 将存储为 3600 - 18000