gpt4 book ai didi

elasticsearch - 按星期几和时间过滤 Elasticsearch

转载 作者:行者123 更新时间:2023-12-04 15:12:50 28 4
gpt4 key购买 nike

我在 Elasticsearch 中有一个企业索引。索引中的每个文档代表一个业务,每个业务都有business_hours。我试图允许使用星期几和时间过滤营业时间。例如,我们希望能够进行过滤,以显示我们在星期二晚上 6:00 之后营业的所有业务
我认为我们应该有一个具有以下映射的字段:

  {
"mappings": {
"properties": {

"business_hours": {
"type": "date_range",
"format": "w'T'hh:mma"
}
}
}
}
然后,每个文档都有一个 business_hours 数组。
因此,周一上午 9:00 - 下午 5:00 和周二上午 9:30 - 下午 5:00 营业的商店将如下所示:
POST my-index/_doc
{
"name": "My Store",
"business_hours": [
{
"gte": "1T09:00AM",
"lte": "1T05:00PM"
},
{
"gte": "2T09:30AM",
"lte": "2T05:00PM"
}
]
}
我试图搜索此文档并查询它,但小时的过滤器不起作用,它们看起来像是被忽略了....
Elasticsearch 是否支持按星期几进行过滤,还是需要是实际的日期时间?
这是我使用的查询。它应该过滤周三营业的业务,但它返回了上面只有周一和周二营业时间的文档
GET my-index/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"business_hours": {
"gte": "3T10:00AM",
"lte": "3T05:00PM",
"relation": "CONTAINS"
}
}
}
]
}
}
}

最佳答案

使用 range 的想法领域是一个很好的。但是,而不是 date_range ,适用于绝对日期,我建议使用 integer_range field 。
由于每天包含 1440 分钟,我的建议是将营业时间编码为自午夜以来的分钟数,并在该数字前加上当天的索引(星期一 = 1、星期二 = 2 等)。将给定的小时数转换为自午夜起的分钟数的公式非常简单:

(60 * HH) + MM 

Note: HH is in 24 hours format, not AM/PM, but that's a detail
以上面的示例为例,它会产生以下结果:
POST my-index/_doc
{
"business_hours": [
{
"gte": 10540, <--- Monday (1), 540 minutes after midnight
"lte": 11020 <--- Monday (1), 1020 minutes after midnight
},
{
"gte": 20570, <--- Tuesday (2), 570 minutes after midnight
"lte": 21020 <--- Tuesday (2), 1020 minutes after midnight
}
]
}
这样 range查询变得简单,它摆脱了任何与日期相关的问题。例如,下面的查询通过搜索周一早上 6 点到下午 5 点之间营业的企业来检索上面的文档
GET my-index/_search
{
"query": {
"bool": {
"filter": [
{
"range": {
"business_hours": {
"gte": "10600", <--- Monday (1), 600 minutes after midnight
"lte": "11020", <--- Monday (1), 1020 minutes after midnight
"relation": "CONTAINS"
}
}
}
]
}
}
}

关于elasticsearch - 按星期几和时间过滤 Elasticsearch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64883176/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com