Проверка доступности с помощью Algolia

Я работаю над сайтом, подобным Airbnb, и я сейчас переписываю нашу внутреннюю поисковую систему на базе SQL с Algolia. До настоящего времени это было действительно приятное путешествие, так как мне удалось удалить много устаревшего кода и передать его на аутсорсинг с потрясающими результатами. Тем не менее, есть одна критическая часть нашей поисковой системы, которую я не уверен, что можно реализовать с 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 так быстро и просто, что мне не хотелось бы отойти от него из-за этих проблем.

Ответ 1

Этот прецедент определенно сложный, и для того, чтобы работать, Алголия нуждается в предварительных данных.

Здесь решение, которое будет очень дорого, но может работать с 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
})