gpt4 book ai didi

search - 使用 Algolia 进行可用性跟踪

转载 作者:行者123 更新时间:2023-12-04 01:12:22 36 4
gpt4 key购买 nike

我正在一个类似 Airbnb 的网站上工作,我正在用 Algolia 重写我们内部的、基于 SQL 的搜索系统。到目前为止,这是一段非常愉快的旅程,因为我设法删除了许多遗留代码并将其外包,并取得了不错的结果。但是,我们的搜索系统中有一个关键部分我不确定是否可以用 Algolia 实现。

在内部,我们将每个 Assets 的每个日期的可用性/不可用性(和价格)存储为数据库中的一行。这意味着我们的 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表并确保日期范围内的所有日期都可用于该 Assets (即可用日期的计数等于范围内的天数)。如果用户输入价格范围,我们还会确保这些日期的平均价格在要求的范围内。 SQL 查询相当复杂,但这就是它在一天结束时所做的。

我一直试图用 Algolia 复制这个,但找不到任何关于类似功能的文档。事实上,我现在面临两个不同的问题:
  • 我无法确保提供的日期范围内的所有日期都可用,因为 Algolia 几乎不了解关联,而且
  • 我无法计算(和查询)所提供日期范围的平均价格,因为它取决于用户输入(即日期范围)。

  • 有没有办法通过 Algolia 实现这一目标?如果不是,使用 SQL 或其他工具与 Algolia 结合使用是否可行?当然,我可以使用 Elasticsearch 完成所有这些工作,但是 Algolia 是如此快速和简单,以至于我不想因为这些问题而放弃它。

    最佳答案

    这个用例绝对是复杂的,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
    })

    关于search - 使用 Algolia 进行可用性跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138629/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com