Alla ricerca di un Algoritmo di ricerca appropriato

2

Attualmente sto pianificando un progetto imminente e sto cercando un algoritmo per la ricerca di un database.

La ricerca è la seguente; Ci saranno alcuni criteri (o campi) specificatamente etichettati e vorrei trovare qualsiasi oggetto in cui i suoi campi corrispondano ai criteri specificati. Inoltre, è necessario classificare i risultati parziali in base alle corrispondenze numeriche per ciascun campo.

Ecco un esempio -

Person 1
Name: John
Occupation: Developer
Favourite Colour: Blue

Person 2
Name: John
Occupation: Manager
Favourite Colour: Blue

Person 3
Name: John
Occupation: Developer
Favourite Colour: Green

Person 4
Name: Larry
Occupation: Mailman
Favourite Colour: Red

Search Criteria
Name: John
Occupation: Developer
Favourite Colour: Blue

Results

Rank 1
Person 1

Rank 2
Person 2
Person 3

I ranghi non sarebbero visibili ma gestiranno l'ordine della lista dei risultati.

Potrei farlo abbastanza facilmente per un piccolo set di dati, ad esempio JavaScript;

results = [];
for(var i = 0; i < objects.length; i++) {
  var result = _.intersection(criteria, object[i]);
  if(result.length > 0) {
    object[i].rank = result.length;
    results.push(object[i])
  }
}
return results (and order by rank)

Ovviamente questo non funzionerà quando si interroga un db ma spero che qualcuno molto più intelligente di me possa indicarmi la giusta direzione. Mi sento come se ci fosse una soluzione a questo fuori ed è probabilmente semplice, ma il mio Google-fu mi sta fallendo.

    
posta Le Ish Man 16.07.2015 - 15:36
fonte

1 risposta

3

Bene, hai o non hai i dati in un normale database? Se lo fai, non c'è modo di interrogare tutte possibili corrispondenze dal database (con una lunga query piena di OR operatori) e quindi ordinare il risultato come meglio credi. In altre parole, non stai cercando un algoritmo di ricerca, ma per le funzioni di ordinamento.

Puoi risolvere questo problema solo con algoritmi speciali se sei disposto ad adattare il formato in cui memorizzi i dati secondo le tue esigenze. Per le istanze, i data warehouse vengono spesso denormalizzati in modo da poter interrogare le singole vendite, ma anche aggregare le vendite e persino trovare mesi con le vendite totali in un determinato intervallo.

È possibile fare qualcosa di simile per il tuo problema precalcolando i punteggi che esprimono quanto bene un record corrisponde a una query e quindi interrogando quell'indice per ottenere buoni punteggi piuttosto che tutti i record per i loro singoli campi. Tuttavia, ciò funziona bene solo quando si hanno query particolari che si pongono ancora e ancora, poiché ogni query definisce il proprio punteggio di corrispondenza specifico. Il tuo esempio sembra che tu possa generare molte query diverse, in effetti arbitrarie. Ciò richiederà probabilmente più sforzo nell'indicizzazione di quello che si risparmia nel recupero.

    
risposta data 16.07.2015 - 15:49
fonte

Leggi altre domande sui tag