2016-01-08 3 views
6

Ich suche nach einer Möglichkeit, in Algolia einen Datensatz zu suchen, wo mindestens ein Element eines Arrays mehrere Bedingungen erfüllt. Als Beispiel vorstellen, diese Art von Rekord:Algolia UND Suche durch ein Array

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

ich nach einer Möglichkeit, eine Abfrage wie die folgenden zu tun:

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

(Ein Produkt, bei dem der Preis ist weniger als 60 für das angegebene Datum)

Diese Abfrage sollte nichts zurückgeben, da die Preisbedingung für dieses Datum nicht erfüllt ist, aber der Datensatz trotzdem zurückgegeben wird. Wahrscheinlich, weil die Bedingung "global" unter allen Preisen erfüllt ist.

Ich bin ein Anfänger mit Algolia und versuche zu lernen. Gibt es einen Weg, wie ich die gewünschte Anfrage machen kann oder muss ich für einen separaten Index für Preise gehen und multiple queries verwenden?

Danke.

Antwort

7

Wenn ein facetFilter oder tagFilter auf ein Array angewendet wird, überprüft die Engine von Algolia, ob ein Element des Arrays übereinstimmt und geht dann zur nächsten Bedingung.

Der Grund, dass es so verhält, und nicht so, wie Sie einfach erwarten ist: Nehmen wir an, Sie ein Array von Strings haben (wie Tags):

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

Wenn ein Benutzer einen Datensatz zu finden, das ist " nutzlos "und" witzig ", sucht dieser Benutzer nicht nach einem Tag, der gleichzeitig" nutzlos "und" witzig "ist, sondern für einen Datensatz, der beide Tags in dem Array enthält.

Die Lösung hierfür ist die Denormalisierung Ihres Objekts in irgendeiner Weise: Umwandlung eines Datensatzes mit einem Array von Objekten in mehrere Datensätze mit jeweils einem Objekt.

So würden Sie

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

verwandeln Sie entweder diese im gleichen Index tun könnte (und distinct verwenden, um de-Duplikat) oder einen Index pro Monat oder Tag . Es hängt wirklich von Ihrem Anwendungsfall ab, was es schwierig macht, Ihnen die richtige Lösung zu geben.