【问题标题】:Availability tracking with Algolia使用 Algolia 进行可用性跟踪
【发布时间】:2017-02-09 13:57:30
【问题描述】:

我正在开发一个类似 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 又快又简单,我不想因为这些问题而放弃它。

【问题讨论】:

    标签: search algolia


    【解决方案1】:

    这个用例肯定很复杂,Algolia 需要预先计算的数据才能工作。


    编辑 2020(更好的解决方案)

    在每个项目中,您可以简单地存储该位置可用的日期列表,例如

    {
      name: "2 bedroom appartment",
      location: "Paris",
      availabilities: ['2020-04-27', '2020-04-28', '2020-04-30']
      price_cents: 30000
    }
    

    然后,您可以在搜索时生成您需要商品具有的所有可用性的列表,例如(从 4 月 28 日到 4 月 30 日可用):

    index.search('', {
      filters: '' +
        'availabilities:2020-04-28 AND availabilities:2020-04-29 AND availabilities:2020-04-30 AND ' +
        'price_cents >= ' + lowPriceRange + ' AND price_cents <= ' + highPriceRange 
    }) 
    

    在本例中,记录不匹配,因为它缺少 2020-04-29


    另一种解决方案,更通用,但需要更多记录:

    我假设您可以提前预订的天数有一个上限,我假设这里是 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
    })
    

    【讨论】:

    • 不幸的是,我们存储了全年的可用性。有什么方法可以在 Algolia 之前或之后使用 SQL 进行过滤?
    • 那么你会看到每个公寓有 66795 个日期范围,这确实可能太贵了。
    • 结果列表是否总是预期较低(
    • 您会失去 Algolia 的速度,但仍会受益于其文本相关性。
    • 目前我们不会有很多结果,但我们可能会继续前进。这种解决方案的规模如何?我可以采用哪些技术来使其更具可扩展性?
    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多