2010-08-24 13 views
1

Tous,XML Recherche Flux Mots-clés pour

Je construis un site qui rassemblera des histoires de nouvelles d'environ 35 différents flux RSS, le stockage dans un tableau. J'utilise une boucle foreach() pour rechercher le titre et la description pour voir s'il contient l'un des 40 mots-clés, en utilisant substr() pour chaque article. Si la recherche est réussie, cet article est stocké dans une base de données, et apparaîtra finalement sur le site.

Le script s'exécute toutes les 30 minutes. Le problème est, cela prend 1-3 minutes selon combien d'histoires sont retournées. Pas "terrible" mais sur un environnement d'hébergement de partition, je peux voir cela causer beaucoup de problèmes, d'autant plus que le site se développe et plus de flux/mots-clés sont ajoutés.

Y a-t-il des façons d'optimiser la "recherche" de mots-clés, pour accélérer l'indexation?

Merci!

Répondre

2

35-40 Les flux RSS sont de nombreuses requêtes qu'un script doit traiter et analyser en une fois. Votre goulot d'étranglement est très probablement les demandes, pas l'analyse. Vous devriez séparer les préoccupations. Avoir un script qui demande un flux RSS un à la fois chaque minute et stocker les résultats localement. Ensuite, un autre script devrait analyser et sauvegarder/supprimer les résultats temporaires toutes les 15-30 minutes.

2

Vous pouvez utiliser XPath pour rechercher le code XML directement ... Quelque chose comme:

$dom = new DomDocument(); 
$dom->loadXml($feedXml); 
$xpath = new DomXpath($dom); 

$query = '//item[contains(title, "foo")] | //item[contains(description, "foo")]'; 
$matchingNodes = $xpath->query($query); 

Ensuite, $matchingNodes sera un DomNodeList de tous les item nœuds correspondant. Ensuite, vous pouvez sauver ceux dans la base de données ...

Donc pour vous régler cela à votre exemple du monde réel, vous pouvez soit construire la requête pour faire toute la recherche d'un seul coup:

$query = array(); 
foreach($keywords as $keyword) { 
    $query[] = '//item[contains(title, "'.$keyword.'")]'; 
    $query[] = '//item[contains(description, "'.$keyword.'")]'; 
} 
$query = implode('|', $query); 

Ou juste re-interroger pour chaque mot-clé ... Personnellement, je construirais une requête géante, puisque alors tout l'appariement est fait en code C respecté (et devrait donc être plus efficace que boucler en PHP et agréger les résultats là). ..