Проверка доступности с помощью 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
})