Domanda

Ho un sito di notizie che contiene un archivio con più di 1 milione di notizie. Ho creato un database di definizioni di parole con circa 3000 voci, composta da coppie di parole alta definizione.

Quello che voglio fare è l'aggiunta di una definizione accanto ad ogni occorrenza di queste parole la notizia. Non posso fare un cambiamento statico che posso aggiungere un nuovo quotidiano parola chiave, così posso farlo in tempo reale o in cache.

La domanda è: un str_replace o un preg_replace sarebbe molto lenta per la ricerca di 3 mila parole chiave in un testo e la loro sostituzione.

Esistono alternative veloci?

È stato utile?

Soluzione

str_replace non funziona per voi (a meno che non si vuole "perl" in "superlativa" per essere una parola chiave), avete bisogno di qualcosa che prende confini di parola in considerazione (ad esempio preg_replace con \b). Naturalmente, non si può preg_replace tutte le 3000 parole chiave contemporaneamente, ma un unico documento può difficilmente li contengono, quindi, io suggerirei di pre-indicizzazione di tutti i documenti, per esempio, mantenendo una tabella indice doc_id-> word_id. Al momento di servire uno specifico documento, interrogare l'indice e sostituire solo le parole chiave che il documento contiene in realtà (presumibilmente non più di 100).

D'altra parte, se i documenti sono brevi, mantenendo la tabella indice potrebbe non essere vale la pena. Si può semplicemente fare pre-indicizzazione al volo, per esempio con strpos:

 $kw = array();
 foreach($all_keywords as $k) if(strpos($text, $k)) $kw[] = $k;

 // $kw contains only words that actually occur in the text
 // (and perhaps some more, but that doesn't matter)

 preg_replace_callback('/\b(' . implode('|', $kw) . ')\b/',  'insert_keyword', $text)

Altri suggerimenti

str_replace è piuttosto scattante ed è, a mia conoscenza, il più veloce si trova per PHP. È certamente opportuno mantenere una cache; che i problemi di prestazioni volontà di bypass.

questo è solo un suggerimento per accelerare il processo, ridurre gli errori, ecc.

  1. Crea una funzione che in batch gli archivi di notizie.
  2. Creare una funzione per sostituire il testo. str_replace è la mia scommessa.
  3. Creare una funzione di processo php deporre le uova. fare riferimento a questa discussione
  4. Aggiungi funzioni caching.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top