Développer avec RBS Change : [Recherche] Filtre sur un topic, récursif
-
28/11/2011 12:16
Bonjour,
Je cherche à créer des filtres par site et par rubrique dans mon moteur de recherche. Dans la classe indexer_QueryHelper j'ai trouvé :
- websiteIdRestrictionInstance : fonctionne bien pour filtrer par site
- descendantOfInstance : ne fonctionne pas pour trier par rubrique... Quelles sont mes autres possibilités ?
Merci d'avance -
47301.2 en réponse à 47301.1 écrit par David Guillot
28/11/2011 15:01
Pourriez-vous préciser sur quel type de document vous tentez d'implémenter cette recherche ?
En gros cette restriction descendantOfInstance dans la recherche backoffice et les information sur lesquelles elle fait son test ne sont indexées que pour le backoffice (cf la méthode buildBackIndexedDocument sur indexer_IndexService).
Cela dit, si votre recherche porte sur un modèle donné, rien n'empêche de rajouter cette information. Ça peut se faire dans le getIndexDocument sur la classe finale du document via la méthode setDocumentAncestors définie sur indexer_IndexedDocument en lui passant les identifiants qui vous arrangent. -
Cette recherche s'appliquerait à tous les documents du site. Nous souhaitons pouvoir restreindre la recherche à une rubrique, mais remonter n'importe quel document présent dans l'arborescence d'une rubrique.
Vous me dites donc que descendantOf ne s'applique que pour les recherches en BO ; mais alors comment réaliser un tel filtre en front ? -
47301.4 en réponse à 47301.3 écrit par David Guillot
29/11/2011 18:07
Le gros problème en fait c'est que bon nombre de documents (principalement dans les modules récents comme download ou event par exemple) sont affichés en front liés à une rubrique mais afin d'être multi-implantables, ne sont pas pour autant dans l'arborescence d'une rubrique (quand au catalogue ou au forum, c'est plus compliqué encore puisqu'il y a des indirections entre la rubrique et le document).
Donc il y a deux points à résoudre :
1) trouver un point central où se greffer pour traiter globalement les document sans avoir à injecter getIndexDocument sur chacun
2) trouver une solution pour prendre en compte un maximum de documents
Concernant le premier point, en l'état ce n'est pas évident à mettre en place en l'état. Je viens d'ouvrir un ticket pour ajouter un point d'entrée : Impossible d'agir globalement pour ajouter des infos à l'indexation des documents
Un fois qu'il sera résolu, il vous suffira de surcharger la méthode completeFrontIndexDocument qui sera appelée pour chaque document indexé.
Concernant le second point, il est possible de s'en sortir en traitant les cas les plus courants :
- si le document a des rubriques dans ses ancêtres, c'est bon
- si le document a un champ "topic" contenant des document de type "modules_website/topic", c'est bon aussi
- pour les autres (notamment les produits et les messages de forum) c'est à gérer au cas par cas... -
Voilà, j'ai traité le ticket mentionné plus haut et mis à jour le clone public du repository.
-
06/01/2012 17:40
Je déterre ce sujet car je me suis enfin attaqué à cette problématique. Donc :
- Injection de l'IndexService : OK
- Ajout, dans la surcharge de la méthode completeFrontIndexDocument, des identifiants des topics auxquels le document est rattaché (ainsi que leurs ancêtres) à un champ d'indexation complémentaire (avec setComplete2Field). Les valeurs multiples sont prises en charge automatiquement
- Dans mon bloc de recherche, ajout d'un TermQuery sur ce nouveau champ
Et tout marche parfaitement, merci !!
Merci de prendre connaissance et de respecter les règles des forums.