2017-02-09 85 views
11

Pracuję na Airbnb podobnego stronie i jestem w trakcie przepisywania nasz in-house, SQL na bazie systemu wyszukiwania z Algolia. To była naprawdę przyjemna podróż do tej pory, ponieważ udało mi się usunąć wiele starszego kodu i zlecić go na zewnątrz, z niesamowitymi rezultatami. Jest jednak jeden krytyczny element naszego systemu wyszukiwania, którego nie jestem pewien, czy mogę go wdrożyć w Algolii.Dostępność śledzenia z Algolia

Wewnętrznie możemy przechowywać dostępność/niedostępność (i cena) każdej dacie dla każdego składnika w postaci pojedynczego wiersza w bazie danych. Oznacza to nasza availabilities tabela wygląda następująco:

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 

Gdy użytkownik wyszukuje dostępnych właściwości oni wprowadzić zakres dat i opcjonalnie przedział cenowy.

Co teraz robimy, to po prostu zapytanie do tabeli availabilities i upewnienie się, że wszystkie daty w zakresie dat są dostępne dla tego zasobu (tzn. Liczba dostępnych dat jest równa liczbie dni w zakresie). Jeśli użytkownik wprowadzi przedział cenowy, upewniamy się również, że średnia cena dla tych dat mieści się w żądanym zakresie. Kwerenda SQL jest dość skomplikowana, ale tak właśnie jest pod koniec dnia.

Próbowałam powtórzyć to z Algolia, ale nie mógł znaleźć żadnej dokumentacji o podobnej funkcji. W rzeczywistości, jestem stoi dwie oddzielne kwestie teraz:

  • nie mam możliwości, aby wszystkie daty przewidzianego zakresu dat są dostępne, ponieważ Algolia ma niewiele ma wiedzy o stowarzyszeniach oraz
  • mam nie można obliczyć (i zapytać) średniej ceny z podanego zakresu dat, ponieważ zależy ona od danych wprowadzonych przez użytkownika (tj. zakresu dat).

Czy można to osiągnąć za pomocą Algolii? Jeśli nie, czy możliwe jest użycie SQL lub innego narzędzia w połączeniu z Algolia, aby osiągnąć pożądany rezultat? Oczywiście mogłem to wszystko zrobić z Elasticsearch, ale Algolia jest tak szybka i łatwa, że ​​z powodu tych problemów nie chciałbym odejść.

Odpowiedz

2

to use-case jest zdecydowanie skomplikowane i Algolia potrzebuje danych precomputed w celu podjęcia pracy.

Oto rozwiązanie, które byłoby bardzo kosztowne, ale może pracować z Algolia.

Zakładam, że jest limit kwoty dni z góry, które można zarezerwować, zakładam, że jest to 90 dni.
Możesz wygenerować każdy zakres dat możliwy w ciągu tych 90 dni.
Oznaczałoby to generowanie 90 + 89 + ... = 90 * 91/2 = 4095 zakresy dat.
Następnie dla każdego z tych zakresów, a każde z mieszkań jesteś oferujących na usługi, można wygenerować obiekt tak:

{ 
    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 
} 

Z tych obiektów, a następnie szukają dla zakresu dat będzie tak proste jak:

index.search('', { 
    filters: '' + 
    'availability_range:"' + startDate + ' -> ' + endDate + '" AND ' + 
    'price_cents >= ' + lowPriceRange + ' AND price_cents <= ' + highPriceRange 
}) 

Byłbyś indeksowanie tylko dostępne zakresy czasu, więc to powinno znacznie zmniejszyć ilość przedmiotów, ale to i tak będzie zapewne ogromne.

Wreszcie, znaczniki czasu w obiekcie będą tutaj wiedzieć, które z nich usunąć podczas dokonywania rezerwacji. Połączenie może wyglądać następująco:

index.deleteByQuery('', { 
    filters: 'availability_start_timestamp < ' + booking_end_timestamp + ' AND availability_end_timestamp > ' + booking_start_timestamp 
}) 
+0

Niestety przechowujemy dostępność przez cały rok. Czy istnieje sposób, w jaki mogę użyć SQL do filtrowania przed lub po Algolii? –

+0

Wtedy będziesz szukał 66795 zakresów dat na mieszkanie, co prawdopodobnie byłoby zbyt drogie. – Jerska

+0

Czy zawsze oczekuje się, że lista wyników będzie niska (<1000)? Na przykład, czy ograniczasz także lokalizację? Jeśli tak, to możesz użyć Algolii, aby uzyskać listę identyfikatorów obiektów pasujących do zapytania tekstowego i lokalizacji i wysłać tę listę identyfikatorów do MySQL, aby obliczyć dostępne z tej listy. – Jerska