2017-02-09 15 views
11

Tôi đang làm việc trên trang web giống như Airbnb và tôi đang trong quá trình viết lại hệ thống tìm kiếm dựa trên SQL trong nhà của chúng tôi với Algolia. Nó đã được một hành trình thực sự dễ chịu cho đến nay, như tôi đã quản lý để loại bỏ rất nhiều mã di sản và thuê ngoài nó, với kết quả tuyệt vời. Tuy nhiên, có một phần quan trọng trong hệ thống tìm kiếm của chúng tôi mà tôi không chắc chắn có thể được thực hiện với Algolia.Tính khả dụng theo dõi với Algolia

Nội bộ, chúng tôi lưu trữ tính khả dụng/không có sẵn (và giá) của mỗi ngày cho từng nội dung dưới dạng một hàng trong cơ sở dữ liệu. Điều này có nghĩa bảng availabilities của chúng tôi trông như thế này:

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 

Khi người dùng tìm kiếm các thuộc tính có sẵn, họ bước vào một phạm vi ngày và tùy chọn, một mức giá.

Hiện tại, chúng tôi đang truy vấn bảng availabilities và đảm bảo rằng tất cả các ngày trong phạm vi ngày đều có sẵn cho nội dung đó (nghĩa là số ngày có sẵn bằng số ngày trong phạm vi). Nếu người dùng nhập một phạm vi giá, chúng tôi cũng đảm bảo rằng giá trung bình cho những ngày đó nằm trong phạm vi được yêu cầu. Truy vấn SQL khá phức tạp, nhưng đây là những gì nó làm vào cuối ngày.

Tôi đã cố gắng sao chép điều này bằng Algolia, nhưng không thể tìm thấy bất kỳ tài liệu nào về tính năng tương tự. Trong thực tế, tôi đang phải đối mặt với hai vấn đề riêng biệt ngay bây giờ:

  • tôi không có cách nào để đảm bảo tất cả các ngày trong phạm vi ngày được cung cấp có sẵn, vì Algolia có ít hoặc không có kiến ​​thức về các hiệp hội, và
  • Tôi có không có cách nào để tính toán (và truy vấn) giá trung bình cho phạm vi ngày được cung cấp, bởi vì nó phụ thuộc vào đầu vào của người dùng (tức là phạm vi ngày).

Có cách nào để đạt được điều này với Algolia không? Nếu không, là nó khả thi để sử dụng SQL hoặc công cụ khác kết hợp với Algolia để đạt được kết quả mong muốn? Tất nhiên, tôi có thể làm tất cả những điều này với Elasticsearch, nhưng Algolia quá nhanh và dễ dàng đến nỗi tôi ghét phải tránh xa nó vì những vấn đề này.

Trả lời

2

Trường hợp sử dụng này chắc chắn là phức tạp và Algolia cần dữ liệu được phân tích trước để hoạt động.

Đây là giải pháp rất tốn kém nhưng có thể hoạt động với Algolia.

Tôi giả sử có giới hạn số ngày trước bạn có thể đặt, tôi sẽ giả định ở đây là 90 ngày.
Bạn có thể tạo mọi phạm vi ngày có thể trong vòng 90 ngày đó.
Điều này có nghĩa là tạo ra 90 + 89 + ... = 90 * 91/2 = 4095 phạm vi ngày.
Sau đó cho mỗi người trong số những phạm vi này, và mỗi người trong số các căn hộ bạn đang cung cấp trên dịch vụ của bạn, bạn có thể tạo một đối tượng như thế này:

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

Với các đối tượng, sau đó tìm kiếm một phạm vi ngày sẽ như dễ dàng như:

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

Bạn sẽ chỉ được lập chỉ mục dãy thời gian có sẵn, vì vậy đây sẽ làm giảm đáng kể số lượng các đối tượng, nhưng nó vẫn sẽ có thể rất lớn.

Cuối cùng, dấu thời gian trong đối tượng sẽ ở đây để biết cần xóa những dấu thời gian nào khi đặt phòng được thực hiện. Cuộc gọi sẽ như sau:

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

Thật không may, chúng tôi lưu trữ availabilities cho cả năm. Có cách nào tôi có thể sử dụng SQL để lọc trước hoặc sau Algolia? –

+0

Sau đó, bạn sẽ nhìn vào 66795 phạm vi ngày cho mỗi căn hộ, mà có lẽ sẽ là quá đắt tiền, thực sự. – Jerska

+0

Danh sách các kết quả có luôn luôn thấp (<1000) không? Ví dụ, bạn cũng giới hạn bởi vị trí? Nếu bạn đang có, bạn có thể có thể sử dụng Algolia để có được một danh sách các objectID khớp với truy vấn văn bản + vị trí và gửi danh sách các ID này tới MySQL để tính toán các ID có sẵn trong danh sách này. – Jerska

Các vấn đề liên quan