elasticsearch,database-design,system-design,Datetime,elasticsearch,Database Design,System Design" /> elasticsearch,database-design,system-design,Datetime,elasticsearch,Database Design,System Design" />

Datetime 搜索可预订的项目

Datetime 搜索可预订的项目,datetime,elasticsearch,database-design,system-design,Datetime,elasticsearch,Database Design,System Design,我正在开发一个在线物品预订系统 我正在使用mongo存储预订和项目详细信息 项目 预订 我必须实施搜索b/w日期。搜索应仅返回指定时间段内可用的项目。我如何为这个构建一个可伸缩的搜索?我还计划使用elastic进行搜索。任何有关新技术的建议也欢迎 我建议将预订作为基本对象,并将项目信息放在其中。也就是说: 设置映射: PUT bookings { "mappings": { "properties": { "id": { "type": "keyword"

我正在开发一个在线物品预订系统

我正在使用mongo存储预订和项目详细信息

项目

预订

我必须实施搜索b/w日期。搜索应仅返回指定时间段内可用的项目。我如何为这个构建一个可伸缩的搜索?我还计划使用elastic进行搜索。任何有关新技术的建议也欢迎

我建议将预订作为基本对象,并将项目信息放在其中。也就是说:

设置映射:

PUT bookings
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "item": {
        "properties": {
          "id": {
            "type": "keyword"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "description": {
            "type": "text"
          },
          "extra": {
            "type": "nested"
          }
        }
      },
      "startDate": {
        "type": "date",
        "format": "epoch_millis"
      },
      "endDate": {
        "type": "date",
        "format": "epoch_millis"
      },
      "status": {
        "type": "keyword"
      },
      "userId": {
        "type": "keyword"
      }
    }
  }
}
接受最简单的预订

POST bookings/_doc
{
  "item": {
    "id": "987"
  },
  "startDate": 1587110540025,
  "endDate": 1587220730025
}
*日期字段和相应的项目:


请注意,尽管我们的日期字段定义为epoch_millis,但只要指定格式,我们仍然可以使用人类可读的日期字符串进行查询。如果愿意,您当然可以使用毫秒。

在将项目索引到Elasticsearch时,您可以检查预订情况。试想一下,您正在索引项,并且您从Mongo获得了该项。此外,您可以获取此项目的预订,还可以在Elasticsearch的项目文档中添加类似bookingCount的字段。搜索时,您可以使用bookingCount字段进行搜索,而无需预订项目

通常,索引是异步操作。您可以使用队列。因此,这将减少用户操作的延迟。而且,你可以在那里做你想做的事。您可以通过预订获取摘要,并将其放入项目中

{
  id: "3",
  "name": "",
  "description": "",
  "extra": [{}],
  "bookingCount": "",
  "bookingsByStatus": {
    "status_1": 1233,
    "status_2": 1233,
    ...
  }
}

但这是一个商业决定。在项目和预订的任何更新之后,您需要从Elasticsearch index更新项目。此外,您还可以使用其他解决方案,如@jzzfs提及

我想搜索没有预订的项目。您可以反转itembooking关系,但范围查询仍然有效。但是如果一个项目作为lot of booking,则项目文档将有很多子项。这个比例吗?很多是相对的。试试看。注意尺寸限制:这最终在sabu起作用了吗?你是怎么解决的?
POST bookings/_doc
{
  "item": {
    "id": "987"
  },
  "startDate": 1587110540025,
  "endDate": 1587220730025
}
GET bookings/_search
{
  "_source": "item",
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "startDate": {
              "gte": "17/04/2020",
              "format": "dd/MM/yyyy"
            }
          }
        },
        {
          "range": {
            "endDate": {
              "lte": "18/04/2020",
              "format": "dd/MM/yyyy"
            }
          }
        }
      ]
    }
  }
}
{
  id: "3",
  "name": "",
  "description": "",
  "extra": [{}],
  "bookingCount": "",
  "bookingsByStatus": {
    "status_1": 1233,
    "status_2": 1233,
    ...
  }
}