2010-09-30 12 views
9

Provo a progettare la mia app per trovare voci di database simili.Trova righe simili nel database

Let ad esempio prendere la tavola auto (Tutto in una tabella per mantenere il semplice esempio):

CarID | Car Name | Brand | Year | Top Speed | Performance | Displacement | Price 
1   Z3   BMW  1990 250   5.4   123   23456 
2   3er   BMW  2000 256   5.4   123   23000 
3   Mustang  Ford 2000 190   9.8   120   23000 

Ora voglio fare query così:

"Cerca Auto simili a Z3 (tutte le marche) "(ignora" Car Name ")

Simile in questo contesto indica che la riga in cui la maggior parte delle colonne è esattamente la stessa è la più simile.

In questo esempio sarebbe "3er BMW" da 2 colonne (Prestazioni e spostamento sono gli stessi)

Potete darmi consigli su come progettare le query di database/applicazioni del genere. L'applicazione sarà davvero grande con molte voci.

Inoltre, mi piacerebbe molto apprezzare link o libri utili. (Nessun problema per me di indagare ulteriormente se so dove cercare o cosa leggere)

risposta

3

Si potrebbe provare a dare ad ogni record di un 'punteggio' a seconda delle sue campi

Si potrebbe pesare il punteggio di una colonna a seconda quanto è importante la proprietà per il confronto (ad esempio la velocità massima potrebbe essere più importante della marca)

Ti ritroverai con un punteggio per ogni record, e sarai in grado di trovare record simili confrontando i punteggi e la ricerca i record che sono +/- 5% (per esempio) del record che stai guardando

+1

Potrei a questo punto una funzione 'distanza' per ogni campo per indicare quanto distano due valori per i campi. Questo potrebbe essere moltiplicato per il peso dei campi e per i valori sommati. Sto pensando alle stored procedure. – aaronasterling

2

I metodi di trovare relazioni e somiglianze nei dati si chiama Data Mining, nel tuo caso si potrebbe già provare clustering e classify i dati per vedere quali sono i diversi gruppi quello si presenta.

Penso che this book sia un buon inizio per un'introduzione al data mining. Spero che questo ti aiuti.

2

Per risolvere il problema, è necessario utilizzare uno cluster algorithm. Innanzitutto, è necessario definire una metrica di somiglianza, rispetto alla necessità di contare la somiglianza tra le tuple di input (tutte Z3) e il resto del database. È possibile accelerare il processo utilizzando algoritmi, come ad esempio k-means. Si prega di dare un'occhiata a questa domanda, lì troverete una discussione su problemi simili come il tuo - Finding groups of similar strings in a large set of strings.

Anche questo collegamento è molto utile: http://matpalm.com/resemblance/.

Per quanto riguarda l'implementazione se si dispone di un sacco di tuple (e più di diverse macchine) è possibile utilizzare http://mahout.apache.org/. È un framework di apprendimento automatico basato su hadoop. Avrai bisogno di molta potenza di calcolo, perché gli algoritmi dei cluster sono complessi.

1

Non è davvero una risposta alla tua domanda, ma tu dici di avere molte voci, dovresti considerare normalizing il tuo tavolo auto, spostare Brand su una tabella separata e "Car name"/model su una tabella separata. Ciò ridurrà la quantità di dati da confrontare durante le ricerche.

+0

Sì, certo. Volevo solo avere una tabella nell'esempio. La mia domanda non riguarda affatto le auto. – Ben

Problemi correlati