Ho set di dati con ~ 5M voci / righe (~ 2 GB). Ogni voce contiene un campo di posizione (lat / lon-pair-pair) e n campi di parole chiave (keyword-1, keyword-2, ... keyword-n). I campi parola chiave possono contenere più parole chiave, ma sono di importanza diversa / "qualità".
Ho bisogno di eseguire una query su questo set di dati che restituisca le voci k "migliori per qualsiasi combinazione data di (posizione, {keyword-1, keyword-2, ... keyword -n}), ordinati per qualità di corrispondenza.
La qualità della corrispondenza è determinata innanzitutto dal conteggio delle corrispondenze delle parole chiave 1 parola chiave, quindi parole chiave-2 parole chiave, ... quindi parole chiave parola chiave-n e infine la distanza tra la posizione di ingresso e la posizione di ricerca
Attualmente (per n = 3 e k = 10) questo è implementato all'interno di mysql come una tabella con la posizione (e btree-indices su lat / lon) e una tabella per le parole chiave (sempre indicizzate su btree). Per eseguire la query viene eseguito un join sulle 2 tabelle per le parole chiave keyword-1 e il set di risultati viene ordinato e troncato, se il set di risultati aveva meno di k righe la query viene ripetuta per keyword-2 parole chiave e così via.
Questo ha funzionato abbastanza bene finora, ma con l'aumentare del volume di dati e query, i tempi di risposta sono diventati preoccupanti. Attualmente una query richiede circa 300ms.
Non sono sicuro su come procedere successivamente.
La soluzione "facile" sarebbe quella di ottenere più macchine e distribuire le query su di esse, ma i dati sarebbero distribuiti su più macchine, il che non è l'ideale dato che i dati dovranno essere mantenuti sincronizzati e il carico dovrà essere bilanciato e i servizi dovrebbero essere scoperti / localizzati, ecc.
Ho esaminato varie soluzioni in-memory, ma nessuna di queste offre ricerca basata sulla posizione e basata su parole chiave o ha implementazioni mature o può essere eseguita in modalità a nodo singolo.
Se dovessi implementare questo (forse così semplice) servizio di ricerca, come posso accedervi? Quadtrees / Hilbert-Curves / Geohashes sembrano abbastanza facili da implementare, ma ottenere il bit di allocazione della memoria probabilmente non sarà ancora banale. E dopo, avrei ancora bisogno di unire i risultati insieme a quelli della ricerca per parole chiave ...
Qualcuno di voi ha esperienze con sistemi come questi? Qualche consiglio su cosa fare?