Développer avec RBS Change : [Résolu] Attributs étendus

  • 69672.1

    24/10/2012 10:09


    rbs@ecocea.com
    Rang : Adepte
    Bonjour,

    Des modifications des classes product et declinedproduct ont été effectuées pour ajouter des attributs (restriction de visibilité, dimensions...)

    Je me dis que ce n'est probablement pas une bonne pratique :
    Outre le fait qu'on s'expose à des soucis à chaque upgrade, je ne vois pas bien comment intégrer un filtre sur mon solr qui s'appuie sur les compiledproducts (ex : que les products tout public)

    Je suppose donc que le bon fonctionnement est plutôt d'utiliser les attributs étendus.

    En ce cas, comment définir un attribut étendu booléen ? Créer une liste à 2 valeurs 0/1 ?
    Et quelle sera la syntaxe pour affecter ces valeurs dans un import spécifique , quelque chose du genre ?
     product->setAttributes(array('visible'=>true,'hauteur'=>145);

  • 69672.2 en réponse à 69672.1 écrit par rbs@ecocea.com

    24/10/2012 14:28


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    En supposant que vous êtes en 3.6.2, le plus simple est effectivement de passer par une propriété, car au moins elle ressortira automatiquement via les facettes si vous avez le module.

    Les attributs étendus sont là pour "dépanner" et ne sont pas exploitables pour faire des requêtes, sauf si vous voulez faire une requête sur un champ sérialisé, ce qui peut ne pas être très pratique.

    Si vous n'avez pas le module de gestion des facettes, vous devrez automatiquement repasser par la case développement.

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 69672.3 en réponse à 69672.2 écrit par Jean-Michel

    24/10/2012 16:59


    rbs@ecocea.com
    Rang : Adepte
    Nous sommes en 3.6.1 et sans module de facettes (en fait, on ne veut pas de moteur de recherche complexe sur le front, juste un champ de saisie simple).

    Par contre, nous voulons pouvoir restreindre automatiquement les produits accessibles.

    Il existe un champ booléen visibility sur l'objet product. mais je ne parviens pas à rajouter cette entrée dans ma recherche SolR.
    Je soupçonne qu'il faille que :
    • je modifie product.getIndexedDocument pour rajouter dans text un texte du type visibility=1
    • je modifie mon BlockResultAction (mais comment)
    • je fasse attention à ne pas rajouter le critère dans les critères affichés au client


    Pas très sur ni du procédé ni de comment ajouter à la query un élément
  • 69672.4 en réponse à 69672.3 écrit par rbs@ecocea.com

    25/10/2012 17:29


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    Je ne suis pas très sûr de ce que vous voulez faire, notamment avec la propriété "visibility". Je m'explique pour les autres champs, il vous faut modifier la méthode compiledproduct.getIndexedDocument pour prendre en compte vos différents champs (product.getIndexedDocumentByCompiledProduct étant invoquée par la méthode du compiledproduct).

    Par contre en ce qui concerne la visibilité vous pouvez peut être jouer avec les permissions, ce qui pourrait simplifier les choses.
    Pour plus d'info sur l'indexation, cf la page wiki sur l'indexation.
    Pour voir comment fonctionne le requêtage SolR, voir les classes dans framework/indexer.

    Sinon donnez-nous un peu plus d'infos sur ce que vous cherchez à faire avec "visibility".

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 69672.5 en réponse à 69672.4 écrit par Jean-Michel

    26/10/2012 11:02


    rbs@ecocea.com
    Rang : Adepte
    Une partie des produits du catalogue ne doivent pas être accessibles à tous, et ce n'est pas conditionné par rayonnage.
    => D'où l'usage d'un champ de l'entité product

    Ceci signifie que ces produits ne soient pas ramenés par la recherche.
    Bien entendu, je pourrais utiliser les permissions pour ne pas afficher ces résultats dans le template, mais ils seront comptés dans les résultats de la recherche (count et pagination)
    => D'où ma question sur Solr.

    Je souhaite donc ajouter comme filtre de recherche (selon le user) visibility==true (cad 1)
    D'ailleurs, j'aurais un second critère relatif à la valeur de startpublicationdate
    Mais je ne suis pas familier avec l'API d'indexation

    Et ajouter visibility dans le champ text fonctionne mais le présente en surligné dans le résultat du coup.

  • 69672.6 en réponse à 69672.5 écrit par rbs@ecocea.com

    26/10/2012 14:32


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    Vous pouvez modifier votre méthode getIndexedDocument pour gérer cette propriété dans un champ à part avec quelque chose du type :
    $indexedDoc->setStringField("visibility", $this->getVisibility());
    

    ou
    $indexedDoc->setVolatileIntegerField("visibility", $this->getVisibility());
    


    Sachant (pour simplifier) qu'un champ de type volatile ne sera pas ré-exploitable en retour au niveau du document.
    Il s'agit ensuite de modifier la requête pour interroger SolR qui tiendra compte de ce paramètre "visibility".

    Édité par Jean-Michel 30/10/2012 14:03


    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 69672.7 en réponse à 69672.6 écrit par Jean-Michel

    14/11/2012 12:00


    rbs@ecocea.com
    Rang : Adepte
    Je suis de retour sur mes soucis d'indexation SolR, après avoir résolu tous mes autres problèmes.

    Il me reste donc deux petits soucis quant aux types de données indexées, un booléen et une date

    Le booléen
    Pour le booléen, je l'ai résolu mais partage pour les suivants et suit preneur d'une solution plus carrée : j'ai défini un champ VolatileInteger et seules certaines occurences étaient indexées : en effet, si non setté, la valeur est évaluée à false en test mais comme elle est réellement vide, la ligne suivante pose pb
    $indexedDoc->setVolatileIntegerField("visibility", $this->getVisibility());

    Solution trouvée lors de l'indexation : $indexedDoc->setVolatileIntegerField("visibility", $this->getVisibility()?"1":"0");

    La date
    Là, je ne parviens pas à trouver la syntaxe lors de la recherche
    objectif : ajouter "startpublicationdate" < $finPeriodeCarence
    au boolQuery ci-dessous

    $query = $this->getStandardQuery($queryString, $currentPage, $itemsPerPage, $sort, $request);
    $visFilter=new indexer_VolatileIntegerTermQuery('visibility', '1');
    $boolQuery->add($visFilter);
    query->setFilterQuery($boolQuery);


    Côté indexation, j'ai défini
    $indexedDoc->setDateField("startpublicationdate", $this->getStartpublicationdate());
  • 69672.8 en réponse à 69672.7 écrit par rbs@ecocea.com

    27/11/2012 14:06


    rbs@ecocea.com
    Rang : Adepte
    J'ai encore essayé de nombreuses syntaxes sans succès.
    Je ne parviens pas à ajouter un critère de type date...

    pour indexer, on peut définir $indexedDoc->setDateField
    pour ajouter un filtre , il n'existe pas de indexer_VolatileDateTermQuery ou analogue.
  • 69672.9 en réponse à 69672.8 écrit par rbs@ecocea.com

    05/12/2012 12:31


    Jean-Michel
    Titre : Community Manager
    Rang : Expert
    Bonjour,

    J'ai un pris un peu de temps ce matin et j'ai trouvé à l'adresse wiki.apache.org/solr/SolrQuerySyntax l'information suivante :

    Wiki SolR a dit :
    Although not technically a Syntax difference, please note that if you use the Solr "DateField" type, any queries on those fields (typically range queries) should use either the Complete ISO 8601 Date syntax that field supports, or the DateMath Syntax to get relative dates. Examples:

    timestamp:[* TO NOW]
    createdate:[1976-03-06T23:59:59.999Z TO *]
    createdate:[1995-12-31T23:59:59.999Z TO 2007-03-06T00:00:00Z]
    pubdate:[NOW-1YEAR/DAY TO NOW/DAY+1DAY]
    createdate:[1976-03-06T23:59:59.999Z TO 1976-03-06T23:59:59.999Z+1YEAR]
    createdate:[1976-03-06T23:59:59.999Z/YEAR TO 1976-03-06T23:59:59.999Z]


    En espérant que cette information puisse vous aider à avancer.

    Pour une meilleure réponse, pensez à indiquer la version sur laquelle vous rencontrez des difficultés, ainsi que son type (CMS ou eCommerce core).
    Pour tout problème d'installation indiquez le nom de l'hébergeur et s'il s'agit d'un serveur mutualisé ou dédié.
  • 69672.10 en réponse à 69672.9 écrit par Jean-Michel

    05/12/2012 16:31


    rbs@ecocea.com
    Rang : Adepte
    Après moult essais et recherches, j'ai trouvé !

    1. Les dates doivent être au bon format et date_DateTime n'est pas tout à fait en phase
    Il me renvoie YYYY-MM-DD HH:MI:SS
    Et solr attend YYYY-MM-DDTHH:MI:SSZ

    2.Il manque dans termquery une gestion de DateTermQuery
    et dans IndexedDocument

    Le champ généré dans 'l'indexation est <monchamp>_dt pour date (ou _vol_dt si volatile)

    Le code à définir est dans du genre :
    $dateFilter= new indexer_RangeQuery("startpublicationdate".indexer_Field::DATE_VOLATILE,"*", $endNew); 
    
  • 69672.11 en réponse à 69672.10 écrit par rbs@ecocea.com

    07/12/2012 14:24


    rbs@ecocea.com
    Rang : Adepte
    Bonjour,

    Pour vérifier si une date est nulle ou dans un range, avec SolR, c'est un peu tordu.
    Il faut coder
    -(-myfield:[start TO finish] AND myfield:[* TO *])


    Sauf que je ne parviens pas avec l'API du framework à coder le rouge (le premier -)
    Voici le contenu des parenthèses :

    $dateperiodFilter= new indexer_RangeQuery("startpublicationdate".indexer_Field::DATE_VOLATILE,"*", $endNew);
    $dateperiodFilter->setIsProhibited();
    $dateNullFilter= new indexer_RangeQuery("startpublicationdate".indexer_Field::DATE_VOLATILE,"*", "*");
    
    $dateQuery = indexer_QueryHelper::andInstance();
    $dateQuery->add($dateperiodFilter);
    $dateQuery->add($dateNullFilter);


    • J'ai tenté un
      notInstance(true,$dateQuery)
      Ne change rien

    • J'ai tenté de trouver une méthode du type "prohibited", sans succès...

    • J'ai tenté de travailler directement des chaines de caractères sans sucès non plus
  • 69672.12 en réponse à 69672.11 écrit par rbs@ecocea.com

    17/12/2012 10:11


    rbs@ecocea.com
    Rang : Adepte
    Nous avons contourné le problème, donc plus de besoin.
    Mais je suis néanmoins preneur d'une solution pour un cas futur , si vous en avez une.
  • 69672.13 en réponse à 69672.12 écrit par rbs@ecocea.com

    17/12/2012 15:31


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Potentiellement vous pouvez essayer ça :
    indexer_QueryHelper::notInstance($dateNullFilter, $dateperiodFilter);
    Sinon, ce serait effectivement à nous d'introduire quelque chose pour faire ça.



    Sinon, pour le formatage des dates, vous avez indexer_Field::dateToSolrDate().
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1407 membres
Aucun membre connecté