2016-01-08 14 views
6

Sto cercando un modo per cercare in Algolia un record in cui almeno un elemento di un array soddisfa diverse condizioni. A titolo di esempio, immaginare questo tipo di disco:Algolia E ricerca attraverso un array

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

Sto cercando un modo per fare una query come la seguente:

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

(un prodotto in cui il prezzo è inferiore a 60 per la data indicata)

Quella query non deve restituire nulla perché la condizione di prezzo non è soddisfatta per quella data ma il record viene comunque restituito. Probabilmente perché la condizione è soddisfatta "globalmente" tra tutti i prezzi.

Sono un principiante con Algolia e sto cercando di imparare. C'è un modo per fare la richiesta desiderata o dovrò andare per un indice separato per i prezzi e usare multiple queries?

Grazie.

risposta

7

Quando uno facetFilter o tagFilter viene applicato su un array, il motore di Algolia controlla se qualche elemento dell'array corrisponde e passa alla condizione successiva.

La ragione si comporta in questo modo e non il modo in cui ti aspettavi è semplice: supponiamo di avere un array di stringhe (come i tag):

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

Quando un utente vuole trovare un record che è " inutile "e" divertente ", questo utente non sta cercando un tag che sia" inutile "e" divertente "allo stesso tempo, ma per un record che contiene entrambi i tag nell'array.

La soluzione per questo è denormalizzare l'oggetto in qualche modo: trasformare un record con una serie di oggetti in più record con un oggetto ciascuno.

Così si trasformerebbe

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

in

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

Si potrebbe o farlo nello stesso indice (e utilizzare distinct di de-duplicazione), o di avere un indice al mese o al giorno . Dipende molto dal tuo caso d'uso, il che rende un po 'difficile darti la soluzione giusta.