Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-09-2007 14:57:56

frederic
Membre
Date d'inscription: 04-09-2007
Messages: 31

mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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

 

#2 06-09-2007 16:24:25

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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

 

#3 06-09-2007 17:34:12

frederic
Membre
Date d'inscription: 04-09-2007
Messages: 31

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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 :

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

 

#4 06-09-2007 17:49:33

frederic
Membre
Date d'inscription: 04-09-2007
Messages: 31

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

Désolé, j'ai trouvé il manquait  le second paramètre 'true' :

Code:

 
$index=new Zend_Search_Lucene(INDEX,true);

Maintenant, j'ai un autre problème :

Code:

$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

 

#5 06-09-2007 19:08:41

ndesaleux
Membre
Date d'inscription: 16-04-2007
Messages: 196
Site web

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

Perso, j'avais trouvé la doc relativement claire tongue

j'avais fait ca :

Code:

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);
        }
    }
}

Code:

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 tongue

et pour alimenter mon index :

Code:

$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

Code:

$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 smile
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

 

#6 06-09-2007 22:17:51

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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

 

#7 07-09-2007 11:21:06

frederic
Membre
Date d'inscription: 04-09-2007
Messages: 31

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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 :

Code:

/****** 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 :

Code:

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 :

Code:

<?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() :

Code:

        $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 :

Code:

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

 

#8 07-09-2007 16:13:08

frederic
Membre
Date d'inscription: 04-09-2007
Messages: 31

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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

 

#9 07-09-2007 17:17:34

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

Le sujet est donc [Résolu]?

Hors ligne

 

#10 07-09-2007 17:23:43

frederic
Membre
Date d'inscription: 04-09-2007
Messages: 31

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

oui

Hors ligne

 

#11 10-09-2007 09:28:33

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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] smile

Hors ligne

 

#12 01-07-2014 02:10:50

banak
Nouveau membre
Date d'inscription: 01-07-2014
Messages: 1

Re: mettre en place un moteur de recherche avec Zend_Search_Lucene[resolu]

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages