Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 03-03-2009 09:27:21

jarod51
Nouveau membre
Date d'inscription: 03-03-2009
Messages: 1

[Zend_Search_Lucene] Suppression impossible dans index

Bonjour

Petit soucis avec Zend Lucene. L'index se crée bien sans problème, les recherches se font bien, c'est au moment de la mise à jour que ça ne fonctionne pas.

Alors j'ai lu que la mise à jour était faite par une séquence suppression/"re"création. Lors de la suppression en fait la méthode find() ne me trouve pas le document souhaité et donc ne le supprime pas... donc à chaque ré-indexation (manuelle ou auto) mon index gonfle, gonfle, gonfle...

Si quelqu'un pouvait m'aider ça serait cool

Ci dessous ma méthode de mise à jour de l'index

Code:

    public function updateLuceneIndex()
    {
        foreach(sfConfig::get('app_cultures_allowed') as $culture)
        {
            $index = luceneTools::getLuceneIndex($culture);

            // remove an existing entry
            $hit = $index->find('id:'.$this->getId()); // <- ICI, ça ne renvoie rien alors que j'ai bien des choses dans l'index
            if ($hit)
            {
                $index->delete($hit->id);
            }

            // don't index non-published items
            if (!$this->getIsPublished() || !$this->getIsApproved())
            {
                return;
            }

            $doc = new Zend_Search_Lucene_Document();

            // store item primary key URL to identify it in the search results
            $doc->addField(Zend_Search_Lucene_Field::Keyword('id', $this->getId()));

            $doc->addField(Zend_Search_Lucene_Field::UnIndexed('published_at', $this->getPublishedAt()));
            $doc->addField(Zend_Search_Lucene_Field::UnIndexed('type', $this->getType()));
            $doc->addField(Zend_Search_Lucene_Field::UnIndexed('is_premium', $this->getIsPremium()));

            // index item fields
            $doc->addField(Zend_Search_Lucene_Field::Text('title', $this->getTitle($culture), 'utf-8'));
            $doc->addField(Zend_Search_Lucene_Field::Text('resume', $this->getResume($culture), 'utf-8'));
            $doc->addField(Zend_Search_Lucene_Field::UnStored('content', $this->getContent($culture), 'utf-8'));

            // add item to the index
            $index->addDocument($doc);
            $index->commit();
        }
    }

Hors ligne

 

#2 03-12-2009 23:47:20

nicol@s
Membre
Lieu: Nantes
Date d'inscription: 22-06-2009
Messages: 18
Site web

Re: [Zend_Search_Lucene] Suppression impossible dans index

J'arrive un peu après la guerre mais bon...

Si jamais quelqu'un a le même problème, on ne peut pas récupérer un hit avec un simple find sur un champ clé.

Il faut faire une requête dite booléenne :

Code:

$term  = new Zend_Search_Lucene_Index_Term($this->getId(), 'id');
$subquery = new Zend_Search_Lucene_Search_Query_Term($term);
$query = new Zend_Search_Lucene_Search_Query_Boolean();
$query->addSubquery($subquery, true);
$hits = $index->find($query);
$hit = ( count($hits) == 0 ) ? null : $hits[0];

Dans mon cas je stocke la clé primaire d'une table de bdd ce qui permet de retrouver facilement l'objet indexé à partir du hit Lucene.

On évite ainsi l'utilisation des champs "text" qui stockent le contenu dans l'index (et augmente considérablement sa taille) et on les remplace par des champs "unstored".

Après une recherche sur l'index, si on a besoin de récupérer le contenu des champs,  on les récupère dans la bdd, on y gagne en perfs !

Dernière modification par nicol@s (03-12-2009 23:56:51)

Hors ligne

 

#3 08-12-2009 22:04:02

probitaille
Membre
Lieu: Montréal
Date d'inscription: 20-04-2009
Messages: 336
Site web

Re: [Zend_Search_Lucene] Suppression impossible dans index

Oh ! Pour moi, la guerre continu...J'ai le même problème mais j'essaye de faire la même chose avec l'url.

Code:

$hits = $index->find('url:' . $targets[$i]); //Retourne toujours vide !!!

Et pourtant je fais ceci:

Code:

$doc->addField(Zend_Search_Lucene_Field::Keyword('url', $targets[$i]));

En fait, j'ai suivi ce tutoriel : http://devzone.zend.com/content/zendcon … dCon07.pdf

Ce que je me demande c'est pourquoi on doit faire une requête Booléenne et pas une recherche par Field

Hors ligne

 

#4 09-12-2009 10:46:06

nicol@s
Membre
Lieu: Nantes
Date d'inscription: 22-06-2009
Messages: 18
Site web

Re: [Zend_Search_Lucene] Suppression impossible dans index

Salut,

Je reviens avec plusieurs idées smile

Si tu veux récupérer un document par un identifiant quelconque, la documentation préconise :

Code:

// Retrieving documents with termDocs() method
$term = new Zend_Search_Lucene_Index_Term("http://www.z-f.fr/forum/post.php?tid=2684", "mon_url");
$docIds  = $index->termDocs($term);
foreach ($docIds as $id) {
    $doc = $index->getDocument($id);
    $title    = $doc->title;
    $contents = $doc->contents;
    ...
}

Voir http://framework.zend.com/manual/en/zen … .unique-id

L'url utilisée "http://www.z-f.fr/forum/post.php?tid=2684" me fait penser à un autre problème, celui de l'analyseur utilisé, pour qu'il indexe des chiffres et les retrouve avec find, il faut utiliser un analyseur du type Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8Num_CaseInsensitive

A+
Nicolas

PS : j'ai fais un test rapide, il semble qu'avec cet analyseur find avec juste un identifiant numérique (issu d'une bdd) marche chez moi.

Dernière modification par nicol@s (09-12-2009 10:49:33)

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