2016-01-08 15 views
6

Tôi đang tìm cách tìm kiếm trong Algolia một bản ghi có ít nhất một thành phần của một mảng đáp ứng một số điều kiện. Như một ví dụ, hãy tưởng tượng loại kỷ lục:Algolia VÀ tìm kiếm thông qua một mảng

{ 
    "name": "Shoes", 
    "price": 100, 
    "prices": [ 
    { 
     "start": 20160101, 
     "end": 20160131, 
     "price": 50, 
    }, 
    { 
     "start": 20160201, 
     "end": 20160229, 
     "price": 80, 
    } 
    ] 
} 

Tôi đang tìm kiếm một cách để làm một truy vấn như sau:

prices.price<60 AND prices.start<=20160210 AND prices.end>=20160210

(Một sản phẩm mà giá là ít hơn 60 cho ngày đã cho)

Truy vấn đó sẽ không trả về bất cứ điều gì vì điều kiện giá không được đáp ứng cho ngày đó nhưng bản ghi vẫn được trả về. Có lẽ vì điều kiện được đáp ứng "toàn cầu" trong số tất cả các giá.

Tôi là người mới bắt đầu với Algolia và đang cố gắng tìm hiểu. Có cách nào tôi có thể thực hiện yêu cầu mong muốn hoặc tôi sẽ phải đi một chỉ số riêng cho giá và sử dụng multiple queries?

Cảm ơn.

Trả lời

7

Khi một facetFilter hoặc tagFilter được áp dụng trên một mảng, công cụ của Algolia kiểm tra xem có phần tử nào của mảng khớp với và sau đó chuyển sang điều kiện tiếp theo hay không.

Lý do nó cư xử như vậy và không phải là cách bạn mong đợi rất đơn giản: chúng ta hãy giả sử bạn có một mảng của chuỗi (như thẻ):

{ tags: ['public', 'cheap', 'funny', 'useless'] } 

Khi người dùng muốn tìm một kỷ lục đó là " vô ích "và" hài hước ", người dùng này không tìm kiếm một thẻ vừa là" vô dụng "và" vui "cùng lúc, nhưng đối với bản ghi chứa cả hai thẻ trong mảng.

Giải pháp cho việc này là để chuẩn hóa đối tượng của bạn theo một cách nào đó: chuyển đổi bản ghi với một mảng đối tượng thành nhiều bản ghi với một đối tượng.

Vì vậy, bạn sẽ chuyển

{ 
    "name": "Shoes", 
    "price": 100, 
    "prices": [ 
     { "start": 20160101, "end": 20160131, "price": 50 }, 
     { "start": 20160201, "end": 20160229, "price": 80 } 
    ] 
} 

vào

[ 
    { 
    "name": "Shoes", 
    "default_price": 100, 
    "price": { "start": 20160101, "end": 20160131, "price": 50 } 
    }, 
    { 
    "name": "Shoes", 
    "default_price": 100, 
    "price": { "start": 20160201, "end": 20160229, "price": 80 } 
    } 
] 

Bạn có thể có thể làm điều này trong các chỉ số tương tự (và sử dụng distinct hủy trùng lặp), hoặc có một chỉ số mỗi tháng hoặc ngày . Nó thực sự phụ thuộc vào trường hợp sử dụng của bạn, điều này khiến bạn khó có thể cung cấp cho bạn giải pháp đúng.

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