2017-02-09 9 views
11

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

ответ

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 
}) 
+0

К сожалению, мы сохраняем доступность всего года. Есть ли способ использовать SQL для фильтрации до или после Algolia? –

+0

Тогда вы будете смотреть на 66795 диапазонов дат за квартиру, что, вероятно, было бы слишком дорого. – Jerska

+0

Ожидается ли, что список результатов будет минимальным (<1000)? Например, вы также ограничиваете свое местоположение? Если это так, вы можете использовать Algolia для получения списка идентификаторов объектов, соответствующих запросу text + location, и отправить этот список идентификаторов в MySQL для вычисления доступных из этого списка. – Jerska