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