Progettazione per parole di autocompletamento nel motore di ricerca?

2

Sto cercando di implementare una funzione di completamento automatico per un motore di ricerca. Ho un database di parole (derivato) che si verificano nei documenti che ho per gli utenti di cercare.

Quello che sto pensando di fare è:

  • Costruire un grafico con parole come nodi e bordi ponderati con pesi come il numero di volte in cui queste 2 parole sono state ricercate insieme.

  • Ogni nodo tiene traccia di quale sia la parola più comunemente digitata accanto ad essa.

  • Ogni volta che un utente inizia a digitare la sua query, questo grafico viene interrogato e la prima parola è prevista dalla corrispondenza delle stringhe e quindi classifica le parole corrispondenti in base alla frequenza di ricerca.

  • Quando l'utente inizia a digitare la parola successiva, il grafico viene visitato e i vicini di questo nodo vengono recuperati e mostrati all'utente in ordine di frequenza (peso dei bordi).

Questa è una panoramica approssimativa di ciò che sto cercando di ottenere. Non l'ho ancora implementato. Richiederebbe una buona dose di lavoro per implementarlo e penso che sarebbe piuttosto lento. E per essere onesti, non penso che fare tanto lavoro sapendo che sarà piuttosto lento ne vale la pena.

Se sono sulla strada giusta con questo progetto concettuale, ci sono delle ottimizzazioni che dovrebbero essere apportate a questo per migliorare le prestazioni? O forse un design completamente diverso che dovrei usare invece?

Ho trovato solo 2 documenti sulla previsione delle query, questo e questo . Sono passato attraverso quest'ultimo, ma non è collegato al mio caso d'uso.

    
posta Ayush Gupta 10.03.2016 - 20:09
fonte

2 risposte

1

Quello che stai descrivendo richiederà un sovraccarico enorme e il calcolo dell'effervescenza è un problema non polinomiale (venditore ambulante).

Allo stesso tempo va notato che se implementata correttamente questa soluzione verrà consegnata come previsto. Tuttavia puoi ottenere lo stesso risultato con molto meno overhead.

Avrai bisogno di:

Un dizionario della tabella hash che fornisce puntatori a

Un heap prioritario di heap prioritari, l'heap di primo livello è per la prima parola e gli heap successivi sono per le parole di secondo, terzo, ecc livello.

Questo fornirà accesso rapido e metterà tutte le penalità sulle funzioni di scrittura.

    
risposta data 11.03.2016 - 20:59
fonte
1

N-grammi possono essere una soluzione qui.

  1. Elabora il corpus per preparare un indice di N-grammi
  2. Scopri tutte le possibili frasi di suffisso per la query corrente

La creazione di N-Grams sarebbe lenta, ma le ricerche dovrebbero essere nlog (n)

Modifica:

Due esempi di questa tecnica:

link

link

    
risposta data 20.03.2016 - 15:53
fonte

Leggi altre domande sui tag