Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
je souhaite mettre en place un moteur de recherche avec le Zend Framework et donc utilisé Zend_Search_Lucene.
Je lis en ce moment cette doc : http://framework.zend.com/manual/fr/zen … ucene.html
Voilà, j'engage ceux qui ont déjà mis en place ce type de module de faire partager les étapes du montage :
Merci à vous !
PS : Personnellement je ne trouve que la doc soit très explicite, ils n'indiquent malheureusement pas trop comment mettre en place ce moteur.
Question :
1) Dans quel fichier paramètre-t-on l'indexation ?
2) Peut-on empêcher l'acces au répertoire de l'index avec un .htaccess ?
3) Faut-il créer un controller particulier du type SearchController ou l'implémenter dans l'indexController avec une méthode SearchAction
4) etc... trop de questions...
5) Quelqu'un connaitrait-il un tutoriel bien foutu pour mettre en place ce moteur de recherche...
merci, merci...
Dernière modification par frederic (10-09-2007 09:43:23)
Hors ligne
Perso j'me suis penché dessus pour mon site perso mais j'ai pas encore mis ça en place.
Pour indexer les fichiers/infos en base, il faut executer un script dédié. Moi je pensais (vu que j'ai pas trop trop d'infos à indexer) faire un script qui indexe tout (page statique via les vue, et infos en base).
Ensuite pour ce qui est du controller ou action, tout dépend de tes besoins, les options que tu veux => la quantité de traitement.
Je laisse la parole à d'autre qui eux l'on vraiment utilisé (y'en a un sur le forum je le sais... héhé)
Hors ligne
Re,
j'ai commencé à intégrer ce moteur, j'ai un problème avec l'indexation : j'ai une exception du genre :
Fatal error: Uncaught exception 'Zend_Search_Lucene_Exception' with message 'fopen(c:/tmp/mon-index/segments) [<a href='function.fopen'>function.fopen</a>]: failed to open stream: No such file or directory' in C:\wamp\www\zendframework\library\Zend\Search\Lucene\Storage\File\Filesystem.php:63 Stack trace: #0 C:\wamp\www\zendframework\library\Zend\Search\Lucene\Storage\Directory\Filesystem.php(301): Zend_Search_Lucene_Storage_File_Filesystem->__construct('c:/tmp/mon-inde...') #1 C:\wamp\www\zendframework\library\Zend\Search\Lucene.php(226): Zend_Search_Lucene_Storage_Directory_Filesystem->getFileObject('segments') #2 C:\wamp\www\zendframework\applications\controllers\IndexController.php(140): Zend_Search_Lucene->__construct('c:/tmp/mon-inde...', false) #3 C:\wamp\www\zendframework\library\Zend\Controller\Action.php(497): IndexController->rechercherAction() #4 C:\wamp\www\zendframework\library\Zend\Controller\Dispatcher\Standard.php(237): Zend_Controller_Action->dispatch('rechercherActio...') #5 C:\wamp\www\zendframework\li in C:\wamp\www\zendframework\library\Zend\Search\Lucene\Storage\File\Filesystem.php on line 63
Voici mon code :
define('INDEX','c:/tmp/mon-index'); $index=new Zend_Search_Lucene(INDEX); $doc=new Zend_Search_Lucene_Document(); $doc->addField(Zend_Search_Lucene_Field::Text('title',$title,'utf-8')); $doc->addField(Zend_Search_Lucene_Field::Text('artist',$artist,'utf-8')); $index->addDocument($doc); $index->commit();
Quelqu'un aurait-il une idée du problème ?
Dernière modification par frederic (06-09-2007 17:35:49)
Hors ligne
Désolé, j'ai trouvé il manquait le second paramètre 'true' :
$index=new Zend_Search_Lucene(INDEX,true);
Maintenant, j'ai un autre problème :
$doc->addField(Zend_Search_Lucene_Field::Text('title',$title,'utf-8')); $doc->addField(Zend_Search_Lucene_Field::Text('artist',$artist,'utf-8'));
Je ne sais pas à quoi correspond les variables passées en second paramètre ?
Merci de vos réponses... a++ Frédéric
PS, j'ai regardé un peu la classe et j'ai l'impression que cette variable renvoie les valeurs qui sont indexées.
Comme je veux indexer ma base, une partie pour les titres et l'autres pour les auteurs... Que dois-je faire ???
Merci de m'aider. a++ Frédéric
Dernière modification par frederic (06-09-2007 17:56:48)
Hors ligne
Perso, j'avais trouvé la doc relativement claire
j'avais fait ca :
class My_Search extends Zend_Search_Lucene{ private $pathFile = '../app/index/searchEngine' ; function __construct(){ if ( ! file_exists($this->pathFile) ){ parent::__construct($this->pathFile, true); }else{ parent::__construct($this->pathFile); } } }
class My_Doc extends Zend_Search_Lucene_Document{ private $_charset = 'iso-8859-1'; /* function __construct(){ parent::__construct(); // $this->_charset = $charset; } */ function date($date){ parent::addField(Zend_Search_Lucene_Field::UnIndexed('date', (int) $date )); } function identifiant($value){ parent::addField(Zend_Search_Lucene_Field::UnIndexed('identifiant', $value)); } function created(){ parent::addField(Zend_Search_Lucene_Field::UnIndexed('created', time())); } function title($title){ //$title = iconv('ISO-8859-1', 'ACII//TRANSLIT', $title); parent::addField(Zend_Search_Lucene_Field::Text('title', $title,$this->_charset)); } // etc. }
Ce qui me permettai de ne pas me prendre la tête
et pour alimenter mon index :
$index = new My_Search(); $doc = new My_Doc(); // date du document $doc->date( $row['date'] ); // date d'ajout du document $doc->created( time() ); // identifiant de l'actu $doc->identifiant( $row['id'] ); // ajout du doc à l'index $index->addDoc($doc);
Et pour l'utilisation
$index = My_Search(); $query = new Zend_Search_Lucene_Search_Query_Multiterm(); $query->addTerm('termes'); $query->addTerm('a'); $query->addTerm('chercher'); $hits = $index->find($query); plus après parcours des hits
pour répondre a tes questions
Question :
1) Dans quel fichier paramètre-t-on l'indexation ?
Comme tu veux, tu peux le faire a l'ajout d'une donné que tu veux indexer
2) Peut-on empêcher l'acces au répertoire de l'index avec un .htaccess ?
oui, mais pourquoi pas le mettre hors acces web
3) Faut-il créer un controller particulier du type SearchController ou l'implémenter dans l'indexController avec une méthode SearchAction
Comme tu le sens ...
Dernière modification par ndesaleux (06-09-2007 19:10:37)
Hors ligne
Salut,
un lien qui m'a l'air pas mal, peut-être cela pourrait vous être utile :
http://devzone.zend.com/node/view/id/91
et pis un autre :
http://www-128.ibm.com/developerworks/l … php-zend7/
Oh, un autre, une série de slides fourni par le célèbre Shahar Evron :
http://prematureoptimization.org/talks/ … -SE-07.pdf
A+
fred
Hors ligne
Salut à tous,
d'abord merci à tous pour vos pistes de réflexions.
Voilà ce que j'ai fait :
I / Pour l'indexation j'ai ajouté ce code pour l'ajout d'une nouvelle entrée dans la base :
/****** INDEXATION ZEND_SEARCH_LUCENE : ******/ if ( ! file_exists($this->pathFile) ){ $index = new Zend_Search_Lucene($this->pathFile,true); } else { $index = new Zend_Search_Lucene($this->pathFile); } $doc = new Zend_Search_Lucene_Document(); $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created', time())); $doc->addField(Zend_Search_Lucene_Field::Text('title', $title,$this->_charset)); $doc->addField(Zend_Search_Lucene_Field::Text('artist', $artist,$this->_charset)); $index->addDocument($doc); /****** FIN INDEXATION_SEARCH_LUCENE *******/
L'indexation a l'air de correctement passer.
II / Pour la recherche, j'ai créé une action rechercheAction dans mon indexController :
public function rechercherAction() { $term = $this->_request->getPost('search_field'); $index = Zend_Search_Lucene(); $query = new Zend_Search_Lucene_Search_Query_Multiterm(); $query->addTerm($term); $hits = $index->find($query); $this->view->results=$hits; }
III / Et enfin, pour l'affichage des résultats, là je cherche pour le moment à grossièrement afficher un résultat :
<?php foreach($this->results as $hits) { echo $hits->artist; } ?>
Mais rien ne s'affiche, certainement que j'ai du mal faire quelque chose mais pour le moment je bloque légèrement. Je vais regarder la doc, mais si vous avez des idées merci de m'aider !
A+ Frédéric
PS : En lisant la doc j'ai légèrement modifié l'action rechercherActtion() :
$index = new Zend_Search_Lucene($this->pathFile); $term = new Zend_Search_Lucene_Index_Term($this->_request->getPost('search_field'),'artist'); $query = new Zend_Search_Lucene_Search_Query_Term($term); $hits = $index->find($query); $this->view->results=$hits;
et pour l'affichage une simple boucle qui parcourt le tableau :
foreach($this->results as $hit) { echo $hit->artist; }
Mais toujours rien, là je commence à ne plus savoir quoi faire... Pour ceux qui auraient une idée... merci beaucoup !
A++ Frédéric
PS : Lorsque je fais un count sur $hits il me renvoie systématiquement zéro ! Apparament il ne trouve rien dans l'index. Lorsque l'on fait une recherche sur quel champ fait-il recherche dans l'index ? TOUS ? Mon indexation serait-elle foireuse ???
a++
Dernière modification par frederic (07-09-2007 13:53:10)
Hors ligne
Re,
Désolé avec toutes mes questions, mais c'est bon j'ai finalement réussit à mettre en place ce moteur.
Le dernier truc qui déconnait était simple : dans mon indexation j'avais oublié $index->commit();
a++
Hors ligne
oui
Hors ligne
Il faut donc le préciser dans le titre du message en le modifiant (pour que les autres visiteurs du forum soient au courant simplement!). Il suffit de rajouter [Résolu]
Hors ligne
salut à tous,
moi je pattoge encore avec le BAB de zend; en effet je suis ce tuto http://framework.zend.com/manual/1.12/f … exing.html et j'aimerais savoir dans quel fichier insérer quel bout de code.
je suis un peu perdu aussi bien sur la résolution ici présenté que sur le tuto dont je viens d epartager le lien !!!
Merci pour votre temps et savoir!!!
Hors ligne
Pages: 1