如何根据溢出时间范围过滤弹性搜索文档?

问题描述 投票:0回答:1

我有一个餐厅索引,该索引的嵌套字段包含dayOfWeek,opening_hour和closeing_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的openingHours和大于等于endRange的关闭时间

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

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

_ source不可用,只有doc值禁止我们访问嵌套字段。

elasticsearch elasticsearch-5 spring-data-elasticsearch elasticsearch-dsl
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.