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 :

[FullTextFilter] il me retourne des lignes dupliquées, mais pourquoi?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut [FullTextFilter] il me retourne des lignes dupliquées, mais pourquoi?
    Bonjour, ce que je tente de faire actuellement c'est; utiliser un filtre hibernate sur 2 champs d'une table, je passe différents parametres au filtre.
    Le soucis là, c'est qu'il me renvoie x fois le meme tuple, et je vois pas pourquoi.

    voici le code deja:

    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
    		List<IJob> jobs = new ArrayList<IJob>();
    		List<IJob> tempJobs = new ArrayList<IJob>();
    		long today = new Date().getTime();
     
    		FullTextEntityManager fem = Search.getFullTextEntityManager(em);
    		Analyzer analyzer = fem.getSearchFactory().getAnalyzer(
    				SOLR_JOB_ANALYZER_NAME);
    		MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] {
    				"name", "description" }, analyzer);
     
    		DecimalFormat nfId = new DecimalFormat("000", DecimalFormatSymbols
    				.getInstance(Locale.US));
     
     
    		if (filter != null && !"".equals(filter.trim())
    				&& (!filter.startsWith("ent:"))) {
    			try {
    				// Query query =
    				// parser.parse(returnLuceneFormatedString(filter));
    				parser.setAllowLeadingWildcard(true);
    				// Lucene parser don't want this char
    				if (filter != null) {
    					filter = filter.replace(':', ' ').trim();
    					filter = filter.replace('^', ' ').trim();
    				}
    				// for (String filtr : filter.split(" ")){
    				// filter += " *" + filtr + "*";
    				// filter += " " + filtr + "*";
    				// filter += " *" + filtr ;
    				// }
    				Query query = parser.parse(StringUtils.convertNonAscii(filter));
    				FullTextQuery hibQuery = fem.createFullTextQuery(query,
    						JobEntity.class);			
     
    				for(int c=0 ; c < zipCode.length ; c++ ){
     
    					for(int d=0 ; d < typeId.length ; d++ ){
     
    						hibQuery.enableFullTextFilter("JobEntity.filter.geoZipCode")
    						.setParameter("publicationDelay", parution)
    						.setParameter("functionId", nfId.format(functionId))
    						.setParameter("typeId", nfId.format(Long.parseLong(typeId[d])))				
    						.setParameter("zipCode", zipCode[c]);
     
     
    						for(int j=0; j < hibQuery.getResultList().size() ; j++){
     
    							tempJobs.add((IJob) hibQuery.getResultList().get(j));
     
    						}
     
    					}
    				}
    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
    public class GeoZipFilter  {
     
     
        private long publicationDelay;
        private String functionId;
        private String typeId;
        private String zipCode;
     
     
        @Key
        public FilterKey getKey() {
            StandardFilterKey key = new StandardFilterKey();
     
            key.addParameter(publicationDelay);
            key.addParameter(functionId);
            key.addParameter(typeId);
            key.addParameter(zipCode);
            return key;
        }
     
        @Factory
        public Filter getFilter() {
     
            ChainedFilter filter = new ChainedFilter() {
                /**
                 * 
                 */
                private static final long serialVersionUID = 8725514094671660409L;
     
                public BitSet bits(IndexReader reader) throws IOException {
                    return super.bits(reader);
                }
            };
     
            filter.addFilter(new RangeFilter("publicationDate", String.valueOf(System.currentTimeMillis()-publicationDelay) , String.valueOf(System.currentTimeMillis()), true, true));
            if (!functionId.equals("000")) {
            	filter.addFilter(new RangeFilter("functionId", functionId, functionId, true, true));				
    		}
     
            if (!typeId.equals("000")) {
            	filter.addFilter(new RangeFilter("typeId", typeId, typeId, true, true));				
    		}
            filter.addFilter(new RangeFilter("archivingDate","0","0",true,true));
     
            return new CachingWrapperFilter(filter) {
     
                private static final long serialVersionUID = 4491361196544402881L;
     
                @SuppressWarnings("deprecation")
    			public BitSet bits(IndexReader reader) throws IOException {
                    return super.bits(reader);
                }
            };
        }

    voila , donc en fait, j'ai un tableau de zipCode, et un tableau de TypeId, je lance donc ma requete hibernate avec filtre pour chacun d'eux, et normalement il devrait me recuperer 1 seule ligne en tout mais au lieu de ca , je recupere 21 fois(il y a 21 zipCode) la meme :/

    N'etant pas un pro dans l'utilisation d'hibernate filter, si quelqu'un pouvait m'éclairer :b


    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut
    Bonjour,

    Une piste de recherche:
    Il s'agit peut être de l'indexation de hibernate search qui n'est pas purger

    Moi je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FullTextEntityManager entityManager =  Search.getFullTextEntityManager( factory.createEntityManager() );
    entityManager.purgeAll( Item.class );
     
    //Item étant une entité managé hibernate.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Salut, merci de cette piste, malheureusement, ca ne change rien

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut
    De rien !

    Néanmoins, il nous manque des informations quand tu exposes ton problème.
    On ne sait pas ce que tu mets comme paramètre
    Quelle est la trace des tuples en sortie ?
    A quoi il ressemble ?

    Si ça ne m'aide pas, ça aidera surement un autre

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    Citation Envoyé par Miday Voir le message
    De rien !

    Néanmoins, il nous manque des informations quand tu exposes ton problème.
    On ne sait pas ce que tu mets comme paramètre
    Quelle est la trace des tuples en sortie ?
    A quoi il ressemble ?

    Si ça ne m'aide pas, ça aidera surement un autre
    Re,
    donc au niveau des paramètres :
    - publicationDelay, c'est une date
    - functionId, un id de type long
    - typeId, en fait au départ je recupere les checkbox checked sur mon formulaire, et je stocke leur id dans un tableau de String.
    - zipCode, meme chose que pour le typeId.

    Le truc c'est que je ne savais pas comment faire pour faire un filtre pour chaque couple typeId - zipcode, donc là j'essaye comme vous pouvez le voir de relancer le filtre pour chaque couple en bouclant sur mes tableaux de typeId et zipCode.

    Les tuples en sortie sont de type IJob , c'est bien ce qui est recherché, le truc c'est qu'au lieu de me retourner 1 tuple , qui serait ici le résultat correct de ma requete, il me retourne 21 tuple identiques et ca fausse mon affichage par la suite.

    en fait l'objet/table job est de la forme suivante :

    id
    archivingDate
    description
    name
    publicationDate
    function_id
    workAddress_id ( c'est dans la table workAddress qu'on recupere le zipCode)
    type_id

    le but etant ici de retourner les job dont le type et le zipCode sont ceux passés en parametres.

    Voila , j'espere avoir été assez clair :p

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut
    Oui!

    Avant les boucles, essaye d'afficher la valeur de
    zipCode.length et de typeId.length.
    Et dis nous quelles sont leurs valeurs?

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2007
    Messages : 500
    Par défaut
    zipCode contient 21 elements et TypeId , 6 elements, ce qui est normal.


    EDIT :
    hm bon, j'ai re-tenté avec un purge de mon entity Job, lucene semble avoir recréé les index, et là il m'affiche le bon nombre de résultat, mais pas pour les bonnes paires de valeurs, encore mieux:

    j'ai créé un deux autres jobs; ce qui fait que j'ai maintenant :
    2 jobs basés à nantes, l'un ayant pour description JAVA et l'autre cobol,
    1 job basé à paris , ayant pour description azerty.

    si je fais une recherche pour cobol ou java, il me trouve bien mes jobs, mais si c'est pour azerty, il ne trouve rien du tout ...


    J'ai l'impression qu'il ne prenne pas réellement en compte mes parametres typeId et zipCode :/

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut
    Je laisserai le soin à un connaisseur averti d'Hibernate Search de t'aider.
    J'avoue que je suis un peu perdu d'après tes résultats 21 zipCodes et 6 typeId normalement tu effectues 21*6 = 126 recherches.

    Comment arrive tu as un résultat de 21 tuples?
    Il doit y en avoir des résultats nulles.

    Comme je disais :
    Je laisserai le soin à un connaisseur averti d'Hibernate Search de t'aider.

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/02/2009, 20h04
  2. filtré des lignes aléatoirement mais sous condition
    Par afssaLERH dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/11/2008, 15h10
  3. Réponses: 0
    Dernier message: 13/08/2007, 12h42
  4. determiner si une requete retourne des lignes
    Par sundjata dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 25/07/2006, 00h19
  5. Retourné des lignes dont certains champs sont vides
    Par griese dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/06/2006, 10h23

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