Best practice per la ricerca

Questo documento descrive le best practice per l'API Search. Utilizziamo gli apici singoli ('') per delimitare le stringhe di query. In questo modo, una query che contiene frasi di più parole racchiuse tra virgolette doppie può essere delimitate senza confusione: 'field:"some text" some-value'.

Chiamate Index.put() e Index.delete() in batch

Puoi trasferire fino a 200 documenti alla volta quando li aggiungi o li elimini da un indice. È molto più efficiente rispetto alla gestione di una alla volta.

Utilizzare il ranking dei documenti per preordinarli

Per impostazione predefinita, la ricerca restituisce i risultati in ordine decrescente di ranking. Inoltre, per impostazione predefinita, l'API Search imposta il ranking di ogni documento in base ai secondi trascorsi dal 1° gennaio 2011. In questo modo, i documenti più recenti vengono restituiti per primi. Tuttavia, se non hai bisogno che i documenti vengano ordinati in base all'ora in cui sono stati aggiunti, puoi utilizzare il ranking per altri scopi. Supponiamo che tu abbia un'applicazione immobiliare. Ciò che i clienti desiderano di più è l'ordinamento per prezzo. Per un ordinamento predefinito efficiente, puoi impostare il ranking sul prezzo della casa.

Se hai bisogno di più ordini di ordinamento, ad esempio prezzo dal più basso al più alto e prezzo dal più alto al più basso, puoi creare un indice separato per ogni ordine. Un indice avrebbe rank = prezzo e l'altro rank = MAXINT-prezzo (poiché il rank deve essere positivo).

L'utilizzo del ranking come chiave di ordinamento migliorerà le prestazioni della ricerca. Per specificare altre chiavi di ordinamento, devi utilizzare le opzioni di ordinamento, che limitano il numero di risultati di ricerca a 10.000 documenti. In questo caso, l'ordine di ordinamento determinato dal rango determinerà quali documenti verranno inclusi nell'ordinamento. Per saperne di più, leggi le informazioni sulle opzioni di ordinamento.

Utilizzare i campi atom per i dati booleani

L'archiviazione di dati booleani nei campi numerici è molto inefficiente. Utilizza invece i campi atom e assegna le costanti che preferisci (Vero/Falso, sì/no, 0/1).

Trasformare gli aspetti negativi in positivi

Supponiamo che tu abbia un termine speciale per identificare i ristoranti la cui cucina è indefinita. Se vuoi escludere questi ristoranti, puoi utilizzare 'NOT cuisine:undefined' come query. Tuttavia, questa operazione è più costosa da valutare (sia in termini di operazioni fatturabili che di tempo di calcolo) rispetto all'operazione opposta, ovvero trovare ristoranti la cui cucina è nota. Anziché un solo campo, cucina, puoi utilizzarne due, cuisine e cuisine_known, con quest'ultimo che è un campo atomo. Per i ristoranti per i quali è definita la cucina, imposta il primo campo sulla cucina effettiva e il secondo campo su "yes". Per i ristoranti di cui non conosci la cucina, imposta la cucina su "" (una stringa vuota) e cuisine_known su "no". Ora, per trovare i ristoranti per i quali è nota la cucina, esegui una query 'cuisine_known:yes', che è molto più veloce della negazione.

Trasformare le disgiunzioni in congiunzioni

La disgiunzione "OR" è un'operazione costosa sia in termini di operazioni fatturabili sia di tempo di calcolo. Supponiamo che tu voglia cercare 'cuisine:Japanese OR cuisine:Korean'. Un'alternativa è indicizzare i documenti con categorie di cucina più generali. In questo caso, la query potrebbe essere semplificata in 'cuisine:Asian'.

Eliminare le tautologie dalle query

Supponiamo di voler trovare tutti i ristoranti di Toronto. Supponendo che i tuoi documenti abbiano un solo campo denominato "city", se utilizzi la query 'city:toronto AND NOT city:montreal' ottieni gli stessi risultati di 'city:toronto', perché se la città è impostata su "toronto" non può essere impostata su "montreal". La seconda query viene eseguita molto più velocemente perché coinvolge un solo termine. La prima query esegue tre passaggi: innanzitutto, trova un elenco di documenti in cui la città è impostata su "toronto", poi trova un elenco di tutte le città in cui la città non è impostata su "montreal" e infine calcola l'intersezione dei due elenchi.

Restringi l'intervallo prima di ordinare

Supponiamo che la tua applicazione memorizzi informazioni sui ristoranti di tutto il mondo e che tu voglia mostrare i ristoranti più vicini all'utente attuale. Un modo per farlo è ordinare i documenti corrispondenti in base alla distanza dalla posizione dell'utente. Tuttavia, se hai 1.000.000 di ristoranti, l'esecuzione di una query come 'cuisine:japanese' con l'espressione di ordinamento distance(geopoint(x, y), restaurant_loc) richiederà molto tempo. È consigliabile aggiungere filtri a una query per iniziare con un insieme più pertinente di documenti selezionati da ordinare. Una soluzione è creare categorie geografiche, come paese, stato e città. Puoi dedurre la città e lo stato dalla posizione dell'utente. La query diventa 'cuisine:japanese AND city:<user-city>'. È molto probabile che non dovrai più ordinare 1.000.000 di documenti.

Utilizza categorie ristrette per evitare o ridurre al minimo l'ordinamento

Se utilizzi la classificazione per ordinare i ristoranti in base al prezzo, puoi creare un campo price_range che contenga le categorie di prezzo: price_0_10, price_11_20, price_21_30, price_31_40, price_41_lots. Puoi quindi trovare tutti i ristoranti che costano tra 21 e 40 $ senza alcun ordinamento utilizzando la query 'price_range:price_21_30 OR price_range:price_31_40'. In molti casi, le categorie appropriate non sono così chiare, ma con questa tecnica puoi rifiutare un gran numero di documenti prima di restringere la ricerca con query costose come '... AND price>25 AND price<35'.

Non assegnare un punteggio alle corrispondenze, a meno che non sia necessario

Il punteggio viene utilizzato per indicare la corrispondenza di un determinato documento con una query. Tuttavia, a meno che tu non intenda ordinare in base al punteggio, non richiedere la valutazione. Rallenterà solo la ricerca.