我正在使用类似Airbnb的网站,我正在使用Algolia重写我们内部的基于SQL的搜索系统。到目前为止,这是一段非常愉快的旅程,因为我已经设法删除了大量遗留代码并将其外包,结果非常棒。但是,我们的搜索系统中有一个关键部分,我不确定是否可以用Algolia实现。
在内部,我们将每个资产的每个日期的可用性/不可用性(和价格)存储为数据库中的单个行。这意味着我们的availabilities
表如下所示:
asset_id | date | status | price_cents
-------- | ---------- | ----------- | -----------
1 | 2017-02-09 | available | 15000
1 | 2017-02-10 | available | 15000
1 | 2017-02-11 | unavailable | NULL
1 | 2017-02-12 | available | 20000
当用户搜索可用属性时,他们会输入日期范围和(可选)价格范围。
我们现在正在做的只是查询availabilities
表并确保日期范围内的所有日期都可用于该资产(即可用日期的数量等于天数范围中)。如果用户输入价格范围,我们还会确保这些日期的平均价格在要求的范围内。 SQL查询相当复杂,但这就是它在一天结束时所做的事情。
我一直试图用Algolia复制这个,但无法找到有关类似功能的任何文档。事实上,我现在面临两个不同的问题:
有没有办法与Algolia实现这一目标?如果没有,是否可以将SQL或其他工具与Algolia结合使用以达到预期效果?当然,我可以用Elasticsearch完成所有这些工作,但是Algolia如此快速和简单,以至于我不愿意因为这些问题而离开它。
答案 0 :(得分:2)
这个用例绝对是复杂的,Algolia需要预先计算的数据才能工作。
这是一个非常昂贵但可以与Algolia合作的解决方案。
我假设您可以提前预订天数上限,我假设这是90天。
您可以在90天内生成每个日期范围
这意味着生成90 + 89 + ...
= 90 * 91 / 2
= 4095
日期范围
然后,对于每个范围,以及您在服务上提供的每个单位,您都可以生成如下对象:
{
name: "2 bedroom appartment",
location: "Paris",
availability_range: "2017-02-09 -> 2017-02-10",
availability_start_timestamp: 10001000,
availability_end_timestamp: 10002000,
price_cents: 30000
}
使用这些对象,然后搜索日期范围就像:
index.search('', {
filters: '' +
'availability_range:"' + startDate + ' -> ' + endDate + '" AND ' +
'price_cents >= ' + lowPriceRange + ' AND price_cents <= ' + highPriceRange
})
你只会索引可用的时间范围,所以这应该会大大减少对象的数量,但它仍然可能很大。
最后,对象中的时间戳将在此处知道在预订时要删除的内容。 电话会是这样的:
index.deleteByQuery('', {
filters: 'availability_start_timestamp < ' + booking_end_timestamp + ' AND availability_end_timestamp > ' + booking_start_timestamp
})