Salut,
Je dois permettre à un utilisateur de chercher des articles qui sont liés à certains tags qu'il peut choisir pour filter.
Et il doit aussi pouvoir entrer des mot-clés pour une recherche full text.
Et il peut définir des groupes de filtres afin de gérer des AND et OR. Au sein d'un groupe les critères sont OR tandis que entre les groupes c'est AND. Ca pourrait donner quelque chose comme ça :
L'association entre les articles et les tags se fait avec une table du genre term_node( tag_id, article_id ).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 filter_group1 : ( (tag1(123) OR tag2(234)) OR (keyword1 OR keyword2) ) AND filter_group2 : ( (tag3(345)) OR (keyword3 OR keyword4) )
La table article a un champ title et un champ body sur lesquels j'ai créé un index FULLTEXT(title, body).
Il est susceptible d'y avoir entre 1 et 6 groupes de filtres. Et il peut exister 1 million d'articles.
La requête est construite en partie dynamiquement en PHP et ressemble à ça :
Est-ce que de telles requêtes ont une chance d'être suffisamment performantes vu la taille du dataset et les jointures ? Sachant que je vais aussi devoir trier ?
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 SELECT node.nid AS article_id, node.title AS article_title, node.body AS article_body FROM node INNER JOIN term_node tn1 ON tn1.nid = node.nid INNER JOIN term_node tn2 ON tn2.nid = node.nid WHERE ( (tn1.tid IN (123, 234)) OR (MATCH(node.title, node.body) AGAINST ('keyword1 keyword2' IN BOOLEAN MODE)) ) AND ( (tn2.tid IN (345)) OR (MATCH(node.title, node.body) AGAINST ('keyword3 keyword4' IN BOOLEAN MODE)) )
Merci d'avance
Partager