Devo implementare la ricerca di prodotto usando la ricerca elastica in modo simile a quanto avviene su qualsiasi sito di e-commerce scalabile. Sto pianificando l'algoritmo di seguito per questo
- Ogni volta che il prodotto viene aggiunto al sistema, prima aggiungilo nel DB e poi nel server ES. ES creerà l'indice sul documento fornito e quindi conserverà sia l'indice che il documento in memoria. Quindi sarà come scrivere nella cache (dove con Cache qui intendevo gli indici e il documento in memoria.) Da non confondere con la cache dei valori chiave come Redis / memcache).
- Dì, il mio documento in DB ha 30 campi, ma ho bisogno di cercare solo su tre campi (nome, descrizione e tipo). Quindi ES avrà 4 (3 + 1) campi. 3 sono campi ricercabili e il quarto campo è l'id della chiave primaria che rappresenta la chiave univoca in DB
- ES crea l'indice su 3 campi internamente mentre lo aggiunge e lo mantiene in memoria.
- Durante la ricerca, la query di ricerca passerà al server ES per multimatch e recupererà il risultato pertinente con l'ordine in base al fattore di aumento della query.
- Il risultato della ricerca conterrà l'id del campo che rappresenta la chiave primaria del DB con la quale possiamo recuperare ulteriormente i dettagli del prodotto dal DB in base al primario ID chiave.
- Abbiamo bisogno di reindicizzare nuovamente i 3 campi durante l'avvio del server ES. Per questo preleverò i dati dal DB durante l'avvio e lo fornirò a ES.
Con questo design tutto il campo ricercabile sarà memorizzato nella cache in memoria sotto il sistema in qualsiasi momento e non ci sarà cache miss e il sistema dovrà colpire DB. Questo design sembra buono o mi manca qualcosa qui?
Completamento automatico Lo stesso disegno che possiamo usare per il completamento automatico quando l'utente inizia a digitare. Ad esempio, quando l'utente inizia a digitare, dire 3 lettere, la query andrà al back end e al di sopra del design funzionerà anche lì. L'unica differenza sarà che restituirà solo risultati limitati per i primi 10 risultati invece di restituire tutti i risultati.
Pubblicherà una domanda separata sulla mia domanda / pensieri su come renderlo scalabile.