Mes données liées à des nœuds ou feuilles d'un arbre et je veux pouvoir faire une recherche en filtrant sur un nœud en espérant trouver toutes les entrées liés à ce nœud ou a sa descendance.
Mes données sont donc
* id_ressource * id_category * ...
Et j'ai un arbre stocké dans une structure classique
* id_category * id_category_parent * ...
1 null 2 null 3 1 4 3 5 3 6 2 7 6 8 6
Solution 1.
J'indexe les données sans me préoccuper de l'arbre, juste en stockant l'id_category d'appartenance.
Lorsque que je veux chercher un nœud, je récupère la liste de ses enfants et puis je cherche tous les objets appartenance à un de ces catégories
donc pour la catégorie 2
;filter:id_category,2,6,7,8
Le problème avec cette solution, c'est qu'avec un arbre imposant, on se retrouve avec des filtres très grands.
Pour mon cas, avec un arbre de 20000 catégorie, on se retrouvait avec des filtres de plus de 5000 valeurs !!!
Solution 2
stocker tout le chemin
donc pour l'objet qui est dans la catégorie 8
on stocke 2, 6, 8
3 valeurs à stocker -> 2 possibilités
- en champ texte
- dans 3 champs "numériques"
J'ai donc crée autant de champs catégorie qu'il n'y a de profondeur dans mon arbre (ici 3)
pour chercher les éléments dans le nœud 2 je fais
;filter:id_category_lvl1,2
pour chercher les éléments dans le nœud 6 je fais
;filter:id_category_lvl2,6
pour chercher les éléments dans le nœud 3 je fais
;filter:id_category_lvl2,3
Solution 3
Suite à une nouvelle demande je viens de penser à une solution tout simple et encore plus performante.
La demande était toute simple : pouvoir chercher dans plusieurs nœud en même temps. par exemple 3 et 2
Ma solution 2 ne va pas en effet
;filter:id_category_1,2;filter:id_category_2,3
ca ne retournerait rien puisqu'aucun objet ne peut être dans 2 ET dans 3
Ma solution 1, empirerait le défaut qu'elle a déjà car je me retrouverai avec encore plus de catégories.
En fait quand j'ai mis en place la solution 2 il y a un type d'attribut sphinx que je ne maitrisait pas vraiment, c'est le mva. mais pour le cas qui nous occupe il est parfait.
Je disais en solution 2, 3 valeurs à stocker -> 2 possibilités Je me trompais. Et mva porte bien son nom.
Il me suffit de stocker les 3 valeurs dans un champs MVA
et ma requête redevient
;filter:id_category,2,3
Mieux encore, la puissance de sphinx fait que je peux fabrique la valeur de remplissage de ce champs à l'indexation, par une "autre" requete Sql
C'est expliqué dans la doc.
Note il est un peu tard, je ne suis peut-être pas très clair.
N'hésitez pas à poser vos question et je retravaillerai le texte en conséquence.








Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire