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

Hibernate Java Discussion :

Hibernate search pour un probleme particulier


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Par défaut Hibernate search pour un probleme particulier
    Bonjour,

    je dois savoir le plus rapidemment possible en quoi HIBERNATE SEARCH peut m'aider à répondre à mon probleme et comme je n'ai pas le temps de lire le livre HIBERNATE SEARCH IN ACTION en entier, j'ai quelques questions preliminaires.

    Voici mon probleme : je travaille sur une application WEB utilisant hibernate (avec JSP, HTML, SPRING, JAVA) et je recherche une technologie qui peut resoudre le probleme suivant : j'ai une base de donnees avec beaucoup d'objets mappes à la base. La structure de la base de donnees est tres complexe. L'interface pour acceder à l'application est accessible pour differents utilisateurs qui ont leur propre role dans l'application. Par exemple l'ARCHITECTE a une vue sur quelques (pas tous) les Studies (etudes) (object Study), une partie des groupes d'items (groupe de champs) de ces etudes (objet ItemGroup), et une partie des Items (champs) (objet Item) des ces groupes d'Items. Cet ARCHITECT a aussi une vue sur quelques (pas tous) Sites (des localisations), et une vue sur quelques (pas tous) utilisateurs (objet User).

    Je veux implementer la fonctionnalite suivante : par exemple l'ARCHITECT peut rentrer quelques mots dans un champ et faire une recherche textuelle sur les objets auxquels il a acces qui comporte des proprietes contenant ces mots. Ceci sera fait par une requete AJAX. La grande question est : est-ce que HIBERNATE SEARCH (technologie qui est decrite dans le livre HIBERNATE SEARCH IN ACTION) est adaptee à mon probleme.

    Les premieres questions qui me viennent à l'esprit sont les suivantes :

    1) j'ai d'abord des doutes sur la rapidite de la reponse, sachant que la recherche se fera sur des dizaines d'objets qui correspondent à plusieurs milliers de lignes de donnes en base pour chaque objet. Est-ce que HIBERNATE SEARCH m'aidera à obtenir une reponse instantanee ?

    2) Je peux d'autre part rentrer dans mon champ le mot "ant". Si je suppose qu'il y a 3 objets qui ontleurs proprietes contenant les mots "avantage", "antenna" et "accountant", j'ai un doute sur la capacite de HIBERNATE SEARCH à trouver ces 3 mots à partir du mot "ant". En effet HIBERNATE SEARCH indexe les proprietes de tables par mot. C'est à dire que cette technologie m'aidera à trouver les 3 mots separemment, mais il ne peut pas faire de recherche sur des chaines de caracteres inclues dans ces mots. Est-ce qu'il y a une facon de resoudre ce probleme avec HIBERNATE SEARCH sans degrader les performances ?

    3) Je vais faire des recherches textuelles dans des objets de l'application et seulement sur les objets qui sont accessibles pour le role de l'utilisateur qui fait la recherche. Du coup, avant de faire ma recherche textuelle, je vais devoir faire une preselection sur les objets pour selectionner uniquement ceux qui sont accessibles. C'est seulement apres que HIBERNATE SEARCH entre en action : Or d'apres ce que j'ai lu, a recherche textuelle se fait sur une classe et sur certaine proprietes de cette classe. Ma questions est : est-il possible de faire une recherche sur une liste d'objets et non sur tous ?

    4) D'apres ce que j'ai compris l'indexation de HIBERNATE SEARCH se fait par objet (avec ses proprietes). Ma question est : est t-il possible d'indexer avec un seul indexe toutes les tables de ma base de donnees de maniere à ce que ma recherche soit plus rapide. En effet, si je defini en entree un ensemble de tables avec certaines de leur proprietes pour chacune, est-il possible d'indexer tout en meme temps ?

    Voilà mes premieres questions. Je n'ai vraiment pas eu le temps de lire le livre HIBERNATE SEARCH IN ACTION et je dois repondre à ces questions rapidemment. Donc merci beaucoup si quelqu'un peut me venir en aide.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    La réponse est oui à toute tes questions.
    De plus, hibernate search te permet d'attaquer directement l'API native de Lucene.
    Donc, si un de tes besoins n'est pas encore implémenter par hibernate search tu pourras t'en sortir.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Par défaut
    Merci spidetra de ta reponse,
    me voila rassuré. Si tu pouvais me donner quelques details techniques suplementaires sur la maniere d'implementer tout cela (quelques pistes) ça serait super, sinon tant pis...

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    Tu n'as pas trop le choix et tu vas bien être obligé de faire ton Proof Of Concept, toi-même.
    Commence par le Getting started de la doc en ligne.
    Documentation en ligne
    Le forum d'Hibernate Search est aussi une bonne source de réponse (en anglais)

    Implémente la solution avec quelques classes de sont domaine,
    Essaye de voir comment résoudre certains de tes uses cases : ex : retourner les bons objets en fonctions des droits.
    etc, etc...

    Tu ne peux choisir cette solution, uniquement parceque quelqu'un sur un forum t'auras dit que c'est approprié à ton problème.
    Je pense que c'est un bon choix, mais rien ne dit que ce choix soit adapté à ta problématique.

    Si des contraintes liées à ton projet ( délai, coût), ne te permettent pas d'investir en temps sur ce framework, est-ce vraiment le bon choix ?

    Est-ce qu'un simple index full text dans ta base de donnée sur les champs que tu veux indexer n'est pas suffisant pour ton projet ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Par défaut
    Voila, j'ai commence par le getting started de la doc en ligne pour HIBERNATE SEARCH.
    J'ai dans l'ordre
    1) telecharge les JAR et les ai mis dans le classpath de ECLIPSE
    2) mappe une 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
     
    @Indexed
    public class User implements UserDetails {
     
    	/**
             * User's ID
             */
    	@DocumentId
    	protected long userId;
    	/**
             * The User's Login
             */
    	@Field(index=Index.TOKENIZED, store=Store.NO)
    	protected String username;
    }
    3) rajoute les proprietes suivantes dans le fichier hibernate.properties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #the default directory provider
    hibernate.search.default.directory_provider = org.hibernate.search.store.FSDirectoryProvider
    #the default base directory for the indecies
    hibernate.search.default.indexBase =/Users/xflamant/lucene/indexes
    4) execute le code suivant dans un test junit (le test s'est bien passe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		Session session = SessionFactoryUtils.getSession(sessionFactory, true);
    		FullTextSession fullTextSession = Search.createFullTextSession(session);
    		Transaction tx = fullTextSession.beginTransaction();
    		List<User> users = session.createQuery("from User as user").list();
    		for (User user : users) {
    		fullTextSession.index(user);
    		}
    		tx.commit();
    Normalement, apres tout cela je devrais avoir un index qui apparait dans mon repertoire /Users/xflamant/lucene/indexes, mais je n'ai rien
    Je ne sais pas où j'ai fait une erreur.
    Voici ma configuration : hibernate 3.2.2, le mapping est genere avec des tags XDOCLET automatiquement et j'ai mes fichiers de configuration dont voici l'extrait qui me concerne :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping>
        <class
            name="com.framework.model.users.User"
            table="USERS"
        >
     
            <id
                name="userId"
                column="userId"
                type="long"
                unsaved-value="null"
            >
                <generator class="native">
                  <!--  
                      To add non XDoclet generator parameters, create a file named 
                      hibernate-generator-params-User.xml 
                      containing the additional parameters and place it in your merge dir. 
                  --> 
                </generator>
            </id>
            <property
                name="username"
                type="java.lang.String"
                update="true"
                insert="true"
                column="username"
                not-null="true"
                unique="true"
            />
    </hibernate-mapping>
    Une chose m'etonne : à aucun moment dans les fichiers de configuration je ne specifie la classe qui est annotée avec des annotations HIBERNATE SEARCH. Est-ce normal ? Merci pour votre aide

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Par défaut
    Bonjour,
    j'ai oublie de dire que je suis sous MAC OS X

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Par défaut
    bonjour,
    voici les references du bouquin à lire :

    http://www.manning.com/bernard/

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

Discussions similaires

  1. Probleme Hibernate Search
    Par crofteur dans le forum Hibernate
    Réponses: 1
    Dernier message: 28/08/2009, 08h19
  2. mise à jour d'index pour HIBERNATE SEARCH
    Par flamant dans le forum Hibernate
    Réponses: 0
    Dernier message: 01/01/2009, 13h59
  3. Réponses: 2
    Dernier message: 06/08/2008, 11h16
  4. Utiliser les exceptions pour un traitement particulier ?
    Par Blustuff dans le forum Assembleur
    Réponses: 11
    Dernier message: 01/12/2004, 02h21
  5. Petite aide pour gros problème : libstdc++
    Par Info-Rital dans le forum Linux
    Réponses: 5
    Dernier message: 30/08/2004, 19h17

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