与Algolia的可用性跟踪

时间:2017-02-09 13:57:31

标签: search algolia

我正在使用类似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几乎不了解关联,
  • 我无法计算(和查询)所提供日期范围的平均价格,因为它取决于用户输入(即日期范围)。

有没有办法与Algolia实现这一目标?如果没有,是否可以将SQL或其他工具与Algolia结合使用以达到预期效果?当然,我可以用Elasticsearch完成所有这些工作,但是Algolia如此快速和简单,以至于我不愿意因为这些问题而离开它。

1 个答案:

答案 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
})