IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

[Lucene]update (maj) et delete (suppression) de document


Sujet :

Servlets/JSP Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2010
    Messages : 36
    Par défaut [Lucene]update (maj) et delete (suppression) de document
    Bonsoir à tous,

    Voilà bientôt une semaine que je rage sur mon incapacité à supprimer
    un document dans un index. J'ai recherché dans la documentation disponible
    et ai essayé les méthodes des classes suivantes sans succès.

    IndexWriter.deleteDocuments(Term)
    IndexWriter.deleteDocuments(Query)
    InderReader.deleteDocuments(Term)

    Dans tous les cas j'utilise correctement la fonction en demandant de supprimer les occurrences sur le champs id le tout en String pour garder cela simple. Rien n'y fait. J'ai bien vérifié de prendre la documentation disponible pour Lucene 3.0.1. L'ajout se fait sans difficulté mais la suppression et la modification (qui nécessite de supprimer puis de ré-ajouter) sont définitivement un cas de mal de tête dans mon cas.

    Un exemple de code pour aider. Les champs m_ sont des membres de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public void supprimerEntreeIndex(String champUnique, String identifiant)
                throws IOException {
            File f = new File(m_pathIndex);
            Directory index = SimpleFSDirectory.open(f);
     
            try {
                IndexReader ir = IndexReader.open(index);
     
                ir.deleteDocuments(new Term(champUnique, identifiant));
            } catch (IOException ioe) {
            }
     
    /////////////////////////////////////
     
    // La même entête jusqu'au try
                boolean doitCreerFichier = !f.exists();
                m_iw = new IndexWriter(index, m_analyser, doitCreerFichier,
                        IndexWriter.MaxFieldLength.UNLIMITED);
     
                // Les champs sur lesquels la recherche sera faite
                String[] fields={champUnique};
     
                Query q = new MultiFieldQueryParser(Version.LUCENE_30, fields,
                        m_analyser).parse(identifiant);
     
                m_iw.deleteDocuments(q);
                m_iw.commit();
     
    /////////////////////////////////////
     
    // La même entête jusqu'au try
                boolean doitCreerFichier = !f.exists();
                m_iw = new IndexWriter(index, m_analyser, doitCreerFichier,
                        IndexWriter.MaxFieldLength.UNLIMITED);
     
                m_iw.deleteDocuments(new Term(champUnique, identifiant));
                m_iw.commit();

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2010
    Messages : 36
    Par défaut
    J'ai trouvé la raison pour laquelle aucune de ces méthode ne fonctionnaient pour moi. La raison est très simple et ridicule. En cherchant pour quelle raison ce code ne fonctionnait pas avec "id" comme field et "[un chiffre]" pour identifiant;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void supprimerEntreeIndex(String champUnique, String identifiant)
                throws IOException {
            File f = new File(m_pathIndex);
            Directory index = SimpleFSDirectory.open(f);
     
            try {
                IndexReader ir = IndexReader.open(index);
     
                ir.deleteDocuments(new Term(champUnique, identifiant));
            } catch (IOException ioe) {
            }
    j'ai réalisé que id était LE SEUL champ que je traitais différemment des autres lors de l'insertion dans l'index. Tous mes champs sont dans la Map indexableData sauf, bien sur, id qui lui est dans nonIndexableData parce qu'à la base je ne voulais pas qu'on puisse rechercher par id... On ne peut pas rechercher dans l'index par l'id. Cela aurait du me sonner une cloche puisque je recherchais dans l'index par l'id pour supprimer ou mettre à jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public Document batirDocument(Map indexableData, Map nonIndexableData) {
            Document d = new Document();
     
            for (int i = 0; i != indexableData.size(); ++i) {
                Pair p = (Pair) indexableData.get(i + 1);
     
                d.add(new Field(String.valueOf(p.t), String.valueOf(p.u),
                        Field.Store.YES, Field.Index.ANALYZED));
            }
     
            for (int j = 0; j != nonIndexableData.size(); ++j) {
                Pair p = (Pair) nonIndexableData.get(j + 1);
     
                d.add(new Field(String.valueOf(p.t), String.valueOf(p.u),
                        Field.Store.YES, Field.Index.NO));
            }
     
            return d;
        }
    La solution donc, pour les gens qui pourraient avoir le même problème est de faire les recherches dans l'index avec des fields qui ont été analysés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d.add(new Field(String.valueOf(p.t), String.valueOf(p.u),
                        Field.Store.YES, Field.Index.ANALYZED));

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb Update datagrid mais delete ok
    Par Gerard_M54 dans le forum Débuter
    Réponses: 3
    Dernier message: 29/04/2008, 14h10
  2. Suppression de documents impossible sur un site
    Par Ancelin dans le forum SharePoint
    Réponses: 5
    Dernier message: 24/12/2007, 17h47
  3. probleme trigger update apres un delete
    Par agur29 dans le forum Développement
    Réponses: 10
    Dernier message: 12/09/2007, 19h30
  4. [File] delete suppression non contrôlée
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/11/2006, 17h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo