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] - Combiner champs recherche approximative et champs recherche exacte sur 2 beans différents


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 53
    Points
    53
    Par défaut [Hibernate Search] - Combiner champs recherche approximative et champs recherche exacte sur 2 beans différents
    Bonjour.
    Voici mon problème.

    J'ai un bean "Article" qui est rattaché à un bean "Revue". Ma recherche hibernate search par approximation s'effectue sur 2 champs de Article (titre et issn). Jusque là tout va bien.

    Le problème, c'est que j'aimerais limiter le nombre de résultats, en requêtant par exemple sur les revues dont l'année de publication est comprise entre deux valeurs (en gros, requête du type 2000 <= revue.annee <= 2010).

    Je voudrais donc savoir comment ajouter à la requête portant sur le bean Article (org.apache.lucene.search.BooleanQuery) les critères fixes relatifs au bean Revue.

    Voici grosso-modo le code à compléter:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
     /* ****************************** */
     /* Code de la DAO du bean Article */
     /* ****************************** */
     public List<Article> getAll(final ArticleHibernateSearchCriteria crit) {
    	List<Article> results = new ArrayList<Article>();
    	final FullTextEntityManager fullTextEntityManager = this.getFullEntityManager();
     
    	 // Query globale.
    	final BooleanQuery finalQuery = new BooleanQuery();
     
    	// Ajout de la partie relative aux articles.
    	this.addArticleQueryPart(crit,
    						   fullTextEntityManager,
    						   finalQuery);
    	// Ajout de la partie relative aux revues. -> pose problème
    	this.addRevueQueryPart(crit,
    						   fullTextEntityManager,
    						   finalQuery);
     
    	// Exécution de la requête et récupération des résultats.
    	final javax.persistence.Query persistenceQuery =
    		fullTextEntityManager.createFullTextQuery(finalQuery,
    												  Article.class,
    												  Revue.class);
    	results = persistenceQuery.getResultList();
    	return results;
     
    }
     
    private void addArticleQueryPart(final ArticleHibernateSearchCriteria crit,
                                       final FullTextEntityManager fullTextEntityManager,
                                       final BooleanQuery finalQuery) {
    	// Ajout des différents éléments de la recherche sur Article dans la query finalQuery.
    	// Fonctionne bien.
    }
     
    private void addRevueQueryPart(final ArticleHibernateSearchCriteria crit,
                                       final FullTextEntityManager fullTextEntityManager,
                                       final BooleanQuery finalQuery) {
    	// Ajout des différents éléments de la recherche sur Revue dans la query finalQuery.
    	final Analyzer analyzer = fullTextEntityManager.getSearchFactory().getAnalyzer(Revue.class);
     
    	// Année.
    	final MultiFieldQueryParser parser =
    		this.getQueryParserFactory().create(new String[]
    											{"annee" },
    											analyzer); // requête sur le champ Revue.annee
     
    	// QUE METTRE ICI POUR FAIRE L'EQUIVALENT DE
    	// 2000 <= revue.annee <= 2010
    	// ??
     
    	finalQuery.add(query,
    				   Occur.MUST);
    }
    J'espère que quelqu'un saura m'aider. Merci.

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Points : 53
    Points
    53
    Par défaut Ma solution...
    Bon alors j'ai fini par trouver la solution à mon problème (merci à Emmanuel Bernard, "THE REFERENCE"!).
    Voici le code de mes beans métiers (épuré, juste avec les quelques annotations d'hibernate search permettant de résoudre le problème).
    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
     
      /* ****************************** */
     /* Beans métiers                  */
     /* ****************************** */
     @Indexed
     public class Article {
    	// ...
     
    	@IndexedEmbedded
    	private Revue revue;
    	// ...
     }
     
     // Notez l'absence de l'annotation @Indexed sur la revue
     public class Revue {
    	// ...
    	@Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED)
        private Integer annee;
     
    	@ContainedIn
        private SortedSet<Article> articles = new TreeSet<Article>(/*...*/);
    	// ...
     }
    Pour résumer :
    - l'annotation @IndexedEmbedded permet d'indexer les revues dans le même fichier que les articles.
    - l'annotation @ContainedIn permet de réindexer automatiquement les articles lorsqu'un des champs indexés dans Revue est modifié.
    - l'annotation @Field(...) permet d'indexer le champ année, sans utiliser les tokens.

    Le code de ma query :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
     /* ****************************** */
     /* Code de la DAO du bean Article */
     /* ****************************** */
     public List<Article> getAll(final ArticleHibernateSearchCriteria crit) {
    	List<Article> results = new ArrayList<Article>();
    	final FullTextEntityManager fullTextEntityManager = this.getFullEntityManager();
     
    	 // Query globale.
    	final BooleanQuery finalQuery = new BooleanQuery();
     
    	// Ajout de la partie relative aux articles.
    	this.addArticleQueryPart(crit,
    						   fullTextEntityManager,
    						   finalQuery);
    	// Ajout de la partie relative aux revues.
    	this.addRevueQueryPart(crit,
    						   fullTextEntityManager,
    						   finalQuery);
     
    	// Exécution de la requête et récupération des résultats.
    	final javax.persistence.Query persistenceQuery =
    		fullTextEntityManager.createFullTextQuery(finalQuery,
    												  Article.class);
    	results = persistenceQuery.getResultList();
    	return results;
     
    }
     
    private void addArticleQueryPart(final ArticleHibernateSearchCriteria crit,
                                       final FullTextEntityManager fullTextEntityManager,
                                       final BooleanQuery finalQuery) {
    	// Ajout des différents éléments de la recherche sur Article dans la query finalQuery.
    	// Fonctionne bien.
    }
     
    private void addRevueQueryPart(final ArticleHibernateSearchCriteria crit,
                                       final FullTextEntityManager fullTextEntityManager,
                                       final BooleanQuery finalQuery) {
    	// Ajout des différents éléments de la recherche sur Revue dans la query finalQuery.
    	final Analyzer analyzer = fullTextEntityManager.getSearchFactory().getAnalyzer(Article.class);
     
    	// Année.
    	final MultiFieldQueryParser parser =
    		this.getQueryParserFactory().create(new String[]
    											{"annee" },
    											analyzer); // requête sur le champ Revue.annee
     
    	final org.apache.lucene.search.Query anneeQuery =
                    parser.parse("revue.annee[2000 TO 2010]"); // requête pour la sélection des articles dont la revue a été publiée entre 2000 et 2010.
     
        finalQuery.add(anneeQuery, Occur.MUST);
    }
    Lien vers la doc de référence de Hibernate Search : http://docs.jboss.org/hibernate/sear...ing-associated.
    Le site d'Emmanuel Bernard, "Mister Hibernate Search" (achetez son livre!) : http://www.emmanuelbernard.com/About%20me.html

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/10/2012, 09h33
  2. Recherche approximative dans un champ
    Par adien.fanget dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/03/2009, 11h10
  3. [Hibernate] Recherche dans un champ
    Par nesbla dans le forum Hibernate
    Réponses: 5
    Dernier message: 09/05/2006, 09h05
  4. ASp - recherche d'un champs dans une base.
    Par kmayoyota dans le forum ASP
    Réponses: 5
    Dernier message: 03/12/2004, 15h03
  5. Recherche d'un mot avec LIKE sur plusieurs champs
    Par reynhart dans le forum Langage SQL
    Réponses: 16
    Dernier message: 26/11/2004, 17h41

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