【问题标题】:How to filter elastic search document based on overflowing hour range?如何根据溢出的小时范围过滤弹性搜索文档?
【发布时间】:2020-09-08 04:35:32
【问题描述】:

我有一个包含 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 的 openingHours

现在 case#2 和 #3 将要求我比较 openingHour 和 startRange 或 closingHour 和 endRange 并相应地修改查询。两者都需要我访问索引值 openingHour 和 closingHour。

我想通过脚本查询来应用逻辑。但是,我意识到在过滤器上下文中 https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-filter-context.html

_source 不可用,只有禁止我们访问嵌套字段的文档值。

【问题讨论】:

    标签: elasticsearch elasticsearch-5 elasticsearch-dsl


    【解决方案1】:

    一种选择是将开放时间拆分为基于星期几的 OH。所以hours_day_of_week_1hours_day_of_week_2 等。这样,您就不再需要nested 数据类型,并且可以从脚本查询中访问所有内容。

    【讨论】:

    • 那肯定行得通。但是,我宁愿保留更直接的数据结构。
    【解决方案2】:

    由于似乎没有简单直接的方法来存储超过 2 天的小时范围,因此我添加了一个整数范围类型的字段 hour_range 来解决问题。这样,如果结束范围低于开始范围,我可以通过增加一天来轻松区分溢出日的范围。

    例如,范围:23:00 - 03:00 将存储为 82800 - 97200,表示一天中的秒数

    范围:01:00 - 05:00 将存储为 3600 - 18000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      相关资源
      最近更新 更多