Best practice per la rete di ricerca

Questo documento descrive le best practice per l'API Search. Usiamo singola le virgolette ('') per delimitare le stringhe di query. In questo modo una query che contiene le frasi composte da più parole racchiuse tra virgolette possono 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. Questo metodo è molto più efficiente rispetto alla gestione di uno alla volta.

Utilizza il ranking dei documenti per pre-ordinare i documenti

Per impostazione predefinita, la ricerca restituisce i risultati in ordine decrescente. Sempre per impostazione predefinita, l'API Search imposta il ranking di ogni documento su secondi dal 1° gennaio 2011. In questo modo, vengono restituiti per primi i documenti più recenti. Tuttavia, se non è necessario ordinare i documenti in base al momento in cui sono stati aggiunti, puoi utilizzare il ranking per altri scopi. Supponiamo che tu abbia una richiesta per il settore immobiliare. Ciò che vogliono di più i clienti è l'ordinamento in base al prezzo. Per un ordinamento predefinito efficiente, puoi impostare il ranking sul prezzo immobile.

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

L'utilizzo del ranking come chiave di ordinamento migliorerà il rendimento della ricerca. Per specificare altre chiavi di ordinamento, devi utilizzare opzioni di ordinamento, che limitano il numero di risultati della ricerca a 10.000 documenti. In questo caso, l'ordinamento determinato in base al ranking determinerà quali documenti saranno inclusi nell'ordinamento. Per scoprire di più, consulta le opzioni di ordinamento.

Usare i campi atom per i dati booleani

L'archiviazione dei dati booleani nei campi numerici è molto inefficiente. Usa invece i campi atomici e assegna le tue costanti preferite (Vero/Falso, Sì/No, 0/1).

Trasforma i valori negativi in positivi

Supponi di avere un termine speciale per identificare i ristoranti la cui cucina non è definita. Se vuoi escludere questi ristoranti, puoi utilizzare 'NOT cuisine:undefined' come query. Tuttavia, la valutazione è più costosa (sia per le operazioni fatturabili che per i tempi di calcolo) rispetto all'avere il contrario, ovvero trovare ristoranti la cui cucina è nota. Anziché avere un solo campo, ovvero cucina, puoi usare due, cuisine e cuisine_known, dove quest'ultimo è un campo atomico. Per i ristoranti per cui viene definita una cucina, devi impostare il primo campo sulla cucina effettiva e il secondo su "yes". Per i ristoranti di cui non conosci la cucina, imposta il tipo di cucina su "" (una stringa vuota) e su cuisine_known su "no". Ora per trovare i ristoranti di cui è nota la cucina, puoi eseguire una query 'cuisine_known:yes', che è molto più veloce della negazione.

Trasforma le disgiunzioni in congiunzioni

L'"OR" la disgiunzione è un'operazione costosa sia per le operazioni fatturabili sia per i tempi di calcolo. Supponiamo di voler cercare 'cuisine:Japanese OR cuisine:Korean'. Un'alternativa è indicizzare documenti con categorie più generali di cucina. In questo caso, la query potrebbe essere semplificata in 'cuisine:Asian'.

Elimina le tautologie dalle query

Supponiamo di voler trovare tutti i ristoranti di Toronto. Supponendo che i documenti abbiano un solo campo denominato "città", 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 poiché riguarda un solo termine. La prima query esegue tre passaggi: prima trova un elenco di documenti in cui la città è impostata su "toronto", poi trova un elenco di tutte le città per le quali 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 archivi informazioni sui ristoranti di tutto il mondo e tu voglia mostrare i ristoranti più vicini all'utente corrente. 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 distanza(geopoint(x, y), ristorante_loc) richiederà molto tempo. È una buona idea aggiungere filtri a una query in modo da iniziare con un insieme più rilevante di documenti selezionati da ordinare. Una soluzione consiste nel creare categorie geografiche, come paese, stato e città, che puoi dedurre città e stato dalla posizione dell'utente. La query diventa 'cuisine:japanese AND city:<user-city>'. È molto probabile che non avrai più bisogno di ordinare 1.000.000 di documenti.

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

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

Non segnare partite a meno che non sia necessario

Il punteggio viene utilizzato per indicare il livello di corrispondenza di un determinato documento con una query. Tuttavia, non richiedere un punteggio, a meno che tu non abbia intenzione di ordinarla per punteggio. ma rallenterà la ricerca.