In diesem Dokument werden die Best Practices für die Search API beschrieben. Abfragestrings werden durchgehend in einfache Anführungszeichen (' ') eingeschlossen. So lässt sich eine Abfrage, die in doppelte Anführungszeichen gesetzte Wortgruppen enthält, eindeutig abgrenzen: 'field:"some text" some-value'
.
Batchaufrufe: Index.put () und Index.delete ()
Wenn Sie einem Index Dokumente hinzufügen oder aus diesem löschen, können Sie bis zu 200 Dokumente gleichzeitig übergeben. Dies ist wesentlich effizienter, als jedes Dokument einzeln zu verarbeiten.
Dokumente nach ihrem Rang vorsortieren
Ergebnisse von Suchvorgängen werden standardmäßig nach absteigendem Rang zurückgegeben. Außerdem legt die Search API seit dem 1. Januar 2011 den Rang jedes Dokuments standardmäßig in Sekundenschritten fest. Dies bedeutet, dass die neuesten Dokumente zuerst zurückgegeben werden. Wenn Dokumente jedoch nicht nach dem Zeitpunkt sortiert werden müssen, zu dem sie hinzugefügt wurden, können Sie den Rang für andere Zwecke verwenden. Angenommen, Sie arbeiten mit einer Immobilienanwendung. Die Sortierung nach Preis wird von Kunden am häufigsten verlangt. In diesem Fall können Sie den Rang auf den Hauspreis festlegen, um eine effiziente Standardsortierung zu gewährleisten.
Wenn Sie mehrere Sortierreihenfolgen wie "Preis von niedrig bis hoch" und "Preis von hoch bis niedrig" benötigen, können Sie für jede Reihenfolge einen separaten Index erstellen. Ein Index hätte dann "Rang = Preis" und der andere "Rang = MAXINT-Preis", da der Rang positiv sein muss.
Durch die Verwendung des Rangs als Sortierschlüssel wird die Suchleistung verbessert. Wenn Sie andere Sortierschlüssel verwenden möchten, müssen Sie Sortieroptionen verwenden, was die Anzahl der Suchergebnisse auf 10.000 Dokumente beschränkt. In diesem Fall gibt die durch den Rang bestimmte Sortierreihenfolge vor, welche Dokumente in die Sortierung einbezogen werden. Unter Sortieroptionen erfahren Sie mehr zu diesem Thema.
Atomare Felder für boolesche Daten verwenden
Es ist sehr ineffizient, boolesche Daten in Zahlenfeldern zu speichern. Stattdessen sollten Sie Atomfelder verwenden und Ihre bevorzugten Konstanten zuweisen (Wahr/Falsch, Ja/Nein, 0/1).
Negationen in Affirmationen umkehren
Angenommen, Sie haben einen speziellen Begriff zur Identifizierung von Restaurants, deren Küche nicht definiert ist. Wenn Sie diese Restaurants ausschließen möchten, können Sie 'NOT cuisine:undefined'
als Abfrage verwenden. Die Auswertung dieser Abfrage ist jedoch aufwendiger (sowohl in Bezug auf die abrechenbaren Vorgänge als auch die Rechenzeit), als wenn Sie nach Restaurants suchen, deren Küche bekannt ist. Anstatt nur das Feld "cuisine" zu verwenden, können Sie die zwei Felder cuisine
und cuisine_known
angeben, wobei Letzteres ein Atomfeld ist. Bei Restaurants, deren Küche bekannt ist, legen Sie dann im ersten Feld die jeweilige Küche fest und geben im zweiten Feld den Wert "yes"
an. Bei Restaurants, deren Küche unbekannt ist, setzen Sie "cuisine" auf ""
(leerer String) und cuisine_known
auf "no"
. Jetzt können Sie für die Suche nach Restaurants, deren Küche bekannt ist, die Abfrage 'cuisine_known:yes'
senden, die viel schneller als die Negation ist.
Disjunktionen in Konjunktionen umkehren
Die OR-Disjunktion ist sowohl in Bezug auf die abrechenbaren Vorgänge als auch die Rechenzeit ein aufwendiger Vorgang. Wenn Sie zum Beispiel nach 'cuisine:Japanese OR cuisine:Korean'
suchen möchten, könnten Sie stattdessen allgemeinere Kategorien für "cuisine" angeben, um Dokumente zu indexieren. In diesem Fall könnte die Abfrage auf 'cuisine:Asian'
vereinfacht werden.
Tautologien aus Abfragen entfernen
Angenommen, Sie möchten alle Restaurants in Toronto finden und Ihre Dokumente haben nur ein einziges Feld namens "city". Wenn Sie jetzt die Abfrage 'city:toronto AND NOT city:montreal'
verwenden, erhalten Sie dieselben Ergebnisse wie mit 'city:toronto'
, da "city" nicht auf "toronto"
und gleichzeitig auf "montreal"
eingestellt sein kann. Die zweite Abfrage wird viel schneller ausgeführt, da sie nur einen Begriff enthält. Für die erste Abfrage werden drei Schritte ausgeführt: Zuerst wird eine Liste von Dokumenten ermittelt, in denen "city" auf "toronto" eingestellt ist. Dann wird eine Liste aller Städte ermittelt, die nicht auf "montreal" eingestellt sind, und zuletzt wird die Schnittmenge der zwei Listen berechnet.
Bereich vor dem Sortieren begrenzen
Angenommen, Ihre Anwendung speichert Informationen zu Restaurants auf der ganzen Welt und Sie möchten die Restaurants aufrufen, die dem aktuellen Nutzer am nächsten sind. Dazu könnten Sie übereinstimmende Dokumente nach der Entfernung vom Standort des Nutzers sortieren. Wenn es jedoch 1.000.000 Restaurants gibt, wird eine Abfrage wie 'cuisine:japanese'
mit dem Sortierausdruck "distance(geopoint(x, y), restaurant_loc)" viel Zeit in Anspruch nehmen. Hier empfiehlt es sich, Filter in die Abfrage aufzunehmen. So können Sie die Sortierung mit einem präziseren Satz von ausgewählten Dokumenten beginnen. Eine Lösung besteht darin, geografische Kategorien wie Land, Bundesstaat und Stadt zu erstellen. Dabei könnten Sie die Stadt und den Bundesstaat vom Standort des Nutzers ableiten. Ihre Abfrage sieht dann so aus: 'cuisine:japanese AND city:<user-city>'
. Die Chancen stehen jetzt sehr gut, dass Sie keine 1.000.000 Dokumente mehr sortieren müssen.
Sortierung durch begrenzte Kategorien vermeiden oder minimieren
Wenn Sie Restaurants anhand des Rangs nach Preis sortieren, könnten Sie ein Feld namens price_range
mit den folgenden Preiskategorien erstellen: price_0_10
, price_11_20
, price_21_30
, price_31_40
, price_41_lots
. Die Abfrage 'price_range:price_21_30 OR price_range:price_31_40'
würde dann ganz ohne Sortierung alle Restaurants mit einem Preisniveau von 21 bis 40 $ ermitteln. Die entsprechenden Kategorien sind nicht immer so eindeutig. Trotzdem können Sie mit dieser Technik eine große Anzahl von Dokumenten aussortieren, bevor Sie die Suche mit aufwendigen Abfragen wie '... AND price>25 AND price<35'
eingrenzen.
Übereinstimmungen nur im Bedarfsfall bewerten
Mithilfe der Bewertung wird angezeigt, in welchem Maß ein bestimmtes Dokument einer Abfrage entspricht. Allerdings sollten Sie die Bewertung nur dann anfordern, wenn Sie nach Punktzahl sortieren möchten. Die Suche wird sonst unnötig verlangsamt.