Ricerca per posizione e parole chiave [chiusa]

1

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?

    
posta BVN 21.10.2015 - 12:28
fonte

1 risposta

0

Personalmente ho fatto simili con un indice di ricerca a testo libero (ovviamente in Oracle, non in MySQL). Abbiamo creato una nuova colonna contenente tutte le parole di riferimento e ho semplicemente detto al DB di indicizzarla, quindi tutte le query sono state eseguite su tali dati. L'ordinamento per importanza è stato fatto in seguito nel codice cliente.

L'indicizzazione della ricerca a testo libero può impostare pesi di parole, sebbene ciò differisca in fase di implementazione. Un rapido google dice che MySql ha un indice di ricerca full-text che può impostare la ponderazione contro le parole usate nella tua query.

Non so se questo aiuti il tuo caso specifico, ma è un buon punto di partenza. È anche veloce e flessibile per query più potenti che potresti usare in seguito (abbiamo applicato un algoritmo personalizzato con doppio metafono per cercare suoni o errori di ortografia per esempio)

    
risposta data 21.10.2015 - 15:52
fonte

Leggi altre domande sui tag