Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour, depuis quelque temps, vous l'aurez remarqué, je travail à créer un module de recherche dans un site web.
Et bien bonne nouvelle, j'ai réussis à le faire fonctionner même s'il est un peu lourd (plusieurs secondes pour la recherche) Merci à Nicol@s pour l'aide.
Lorsque j'affiche les résultats, je peux récupéré le titre de la page contenant le mot, l'url et les metas donnés. Ce que je cherche à faire, c'est également de pouvoir récupéré la phrase (extrait) qui contient le mot comme le site suivant:
Site Zend et module de recherche:
http://www.rockdetente.com/montreal/rec … 36&y=3
Donc, afficher le mot clé recherche et le contenu qui l'entoure. Quelle serait donc la meilleure solution de procéder pour être viable puisque chercher et récupéré le mot clé à travers le contenu d'un site web complet peut être très lourd comme charge de travail au serveur.
Merci de vos solutions et commentaires
Hors ligne
Salut,
Pour ton problème de lenteur quel est la taille de ton index de recherche (nb de docs indexés et taille sur le disque) ? car je travaille avec un index (~10 MO) de plus de 50.000 docs et selon les requêtes j'obtiens des réponses en moins de 0.5 sec.
Celà peut venir du fait que tu indexes des champs de type Zend_Search_Lucene_Field::Text avec beaucoup de contenu (par exemple tout le contenu d'une page web), si c'est le cas, ça n'a d'intérêt que si tu veux récupérer ce contenu à partir d'un résultat de recherche, sinon utilise des champs Zend_Search_Lucene_Field::UnStored tu peux chercher sur les mots contenus mais le texte complet n'est pas stocké.
Ou encore c'est peut être le type de requête que tu utilises (wildcard?) ou juste un serveur sous taillé (le process de recherche est assez gourmand en mémoire).
Solution 1 : si tu utilises un champ Zend_Search_Lucene_Field::Text pour ton contenu, tu peux récupérer les mots qui entourent ta recherche à partir du résultat de recherche :
$recherche = "ma recherche"; $hits = $index->find($requete); foreach ($hits as $hit) { $contenu = $hit->contenu; $pos = strpos($contenu, $recherche); // récupérer les mots avant et après l'indice $pos }
Solution 2 : sinon, il te faut récupérer ton texte en bdd, s'il y est stocké, donc ajouter une clé primaire de ta bdd dans ton document Lucene, puis charger l'objet à partir de cette id, puis enfin... jouer avec des fonctions string pour récupérer les mots qui entoure ta recherche.
A+
Nicolas
PS: attention, selon le type de requêtes que tu construis tu peux retourner des résultats où les termes de recherche ne sont pas juxtaposés dans un champ de document, ou encore des résultats ou l'un des termes est dans un champ (par exemple 'titre') et les autres termes dans un autre champ (par exemple 'contenu').
Dernière modification par nicol@s (10-12-2009 19:20:42)
Hors ligne
Bonjour,
j'ai un souci pour affichacher les resultats de recherche par critére
voici le code de mon controller :
<?php
class Default_RechercheavanceeController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{
}
public function avanceAction()
{
$etat_article = new Default_Model_EtatarticleMapper();
$this->view->aEtat_articles = $etat_article->fetchAll();
$mode_payement = new Default_Model_ModepayementMapper();
$this->view->aMode_payements = $mode_payement->fetchAll();
$sous_categorie = new Default_Model_SouscategorieMapper();
$this->view->aSous_categories= $sous_categorie->fetchAll();
$type_vente = new Default_Model_TypeventeMapper();
//var_dump($type_vente->fetchAll());exit();
$this->view->aType_ventes= $type_vente->fetchAll();
$request = $this->getRequest();
$form = new Default_Form_Rechercheavance();
if ($this->getRequest()->isPost()) {
if ($form->isValid($request->getPost())) {
return $this->_helper->redirector('/recherche');
//return $this->_helper->redirector('rechercheavancee/recherche');
}
}
$this->view->form = $form;
}
public function rechercheAction()
{
$annonce = new Default_Model_AnnonceMapper();
$request = $this->getRequest();
$form = new Default_Form_Rechercheavance();
if ($this->getRequest()->isPost()) {
//getRequest() peut être utilisé pour récupérer l'objet de requête utilisé pour appeler l'action.
if ($form->isValid($request->getPost())) {
$tab = $request->getPost();
//var_dump($tab["Dateinsertion"]); exit();
//var_dump($tab["prix"]); exit();
//var_dump($tab["Mot_cle"]); exit();
//$this->view->resultat= $annonce->search($tab["cp"]);
$this->view->resultat= $annonce->search($tab["Mot_cle"],$tab["prix"],$tab["Designation_etat_art"],$tab["designation_mp"],$tab["designation_sous_categorie"],$tab["designation_type_vente"],$tab["Ville"],$tab["Cp"]);
var_dump($this->resultat);
//var_dump(foreach());
}}}
}
t en gros je voudrais afficher mes résultats sous forme de tableau avec donc un code dans mon .phtml dans le style :
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Page d'accueil</title>
<link rel="stylesheet" href="../css/style.css" type="text/css" media="screen, projection">
</head>
<body>
<div id="corps_depann">
<article>
<section>
<div id="section_depann">
<h1>Recherche avancée </h1>
<div id="form_depann">
<div id="form_tete_depann">
<h2>Critére de recherche</h2>
</div>
<div id="form_corps_depann">
<form action="" method="POST" id="">
<table>
<?php foreach ($this->resultat as $annonce): ?>
<tr>
<tr><td><h2>Mot clé:</h2></td><td><?php echo $this-> escape ($annonce ['Mot_cle']);?></td></tr>
<tr><td><h2>Prix:</h2></td><td><?php echo $this-> escape ($annonce ['prix']);?></td></tr>
<tr><td><h2>Etat de l'article:</h2></td><td><?php echo $this-> escape ($annonce ['Designation_etat_art']);?><td></tr>
<tr><td><h2>Condition de paiement:</h2></td><td><?php echo $this-> escape ($annonce ['designation_mp']);?></td></tr>
<tr><td><h2>Sous_categorie:</h2></td><td><?php echo $this-> escape ($annonce ['designation_sous_categorie']);?></td></tr>
<tr><td><h2>Type de vente:</h2></td><td><?php echo $this-> escape ($annonce ['designation_type_vente']);?></td></tr>
<tr><td><h2>Ville:</h2></td><td><?php echo $this-> escape ($annonce ['Ville']);?></td></tr>
<tr><td><h2>Code postal:</h2></td><td><?php echo $this-> escape ($annonce ['Cp']);?></td></tr>
<tr><td><h2>Date insertion:</h2></td><td><?php echo $this-> escape ($annonce ['Dateinsertion']);?></td></tr></td></tr>
<tr><td><h2>Distance géographique:</h2></td><td><?php echo $this-> escape ($annonce ['Distancegeographique']);?></td></tr>
<tr><td></td>
</div>
</td></tr>
</tr>
<?php endforeach ?>
</table>
</form>
</div>
</div>
</div>
</section>
</article>
</div>
</body>
mais si je fais ca voici le message d'erreur que ca me met :
Critére de recherche
Warning: Invalid argument supplied for foreach() in /prod/proannonce/v1/application/modules/default/views/scripts/rechercheavancee/recherche.phtml on line 29
aide moi si il vous plait
Dernière modification par adouma01 (22-04-2014 13:21:21)
Hors ligne
Bonjour adouma01,
je voudrais savoir si vous avez eu une solution sur ce post, en effet je suis confronté à un problème similaire.
Je dois faire une recherche multicritères sur plusieurs tables de ma base de données en ZF2, je voudrais que vous savoir comment le faire.
Merci par avance et bonne journée,
Cordialement,
Lodia
Hors ligne
Pages: 1