Voor een website waar ik aan bezig ben heb ik een geavanceerde zoekfunctie gemaakt. Deze zoekfunctie heeft redelijk veel ANDs en ORs, en is moeilijk om via indexes te versnellen.
Hij accepteerd een zoek query als
en dan nog een author query op dezelfde manier.
Hij zoekt dan in drie tabellen: Scenes, comments en tags naar "%aan elkaar%" of "%los%", met als author "%user 1%", "%user%" of "%twee%"
Daarnaast kan je bepalen in welke groep hij moet zoeken. Hiervoor nemen we even "group 1"
Dit levert dan deze query op:
Nu kost dit vaak nogal veel tijd, meer dan de bedoeling is.
Vandaar dat ik wil kijken naar een database met losse zoekwoorden, die linken naar een ID en een type (comment of scene).
Nu heb ik eerlijk gezegt geen idee wat de beste manier voor zoiets is, en internet geeft er niet al te veel over bloot.
Mijn idee is om een tabel te maken met 4 kolommen: id, linked_id, value, type
dan kan ik in ieder voorkomen dat SQL door grote texten gaat zoeken voor een woordje, door gewoon in de woordenlijst te zoeken naar een woordje van een bepaald type, en de linked_id gebruiken om de originele scene/comment te vinden.
Heeft iemand hier ervaring met zulke structuren? Wat zijn de voor en nadelen? Zijn er betere methoden dan wat ik van plan ben?
Hij accepteerd een zoek query als
code:
1
| "aan elkaar" los |
en dan nog een author query op dezelfde manier.
code:
1
| "user 1" user twee |
Hij zoekt dan in drie tabellen: Scenes, comments en tags naar "%aan elkaar%" of "%los%", met als author "%user 1%", "%user%" of "%twee%"
Daarnaast kan je bepalen in welke groep hij moet zoeken. Hiervoor nemen we even "group 1"
Dit levert dan deze query op:
SQL:
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
| SELECT DISTINCT scene_id, scene_group, scene_ip, scene_filename, scene_size, scene_title, scene_author, scene_description, scene_password, scene_datetime, scene_rating, scene_nr_downloads, scene_nr_views, scene_nr_comments, scene_nr_ratings, scene_response_to, scene_last_edit, scene_last_edit_by, scene_allow_comments, scene_allow_ratings, scene_allow_responses FROM pbox_scenes, pbox_comments comment , pbox_scene_tags tag WHERE ( scene_group =1 ) AND ( scene_author LIKE '%user 1%' OR scene_author LIKE '%user%' OR scene_author LIKE '%twee%' ) AND NOT ( scene_group =0 ) AND ( scene_title LIKE '%aan elkaar%' OR scene_title LIKE '%los%' OR scene_description LIKE '%aan elkaar%' OR scene_description LIKE '%los%' OR ( ( tag.tag_name LIKE '%aan elkaar%' OR tag.tag_name LIKE '%los%' ) AND tag.tag_scene_id = scene_id ) OR ( ( comment.comment_content LIKE '%aan elkaar%' OR comment.comment_content LIKE '%los%' ) AND comment.comment_scene_id = scene_id ) ) |
Nu kost dit vaak nogal veel tijd, meer dan de bedoeling is.
Vandaar dat ik wil kijken naar een database met losse zoekwoorden, die linken naar een ID en een type (comment of scene).
Nu heb ik eerlijk gezegt geen idee wat de beste manier voor zoiets is, en internet geeft er niet al te veel over bloot.
Mijn idee is om een tabel te maken met 4 kolommen: id, linked_id, value, type
dan kan ik in ieder voorkomen dat SQL door grote texten gaat zoeken voor een woordje, door gewoon in de woordenlijst te zoeken naar een woordje van een bepaald type, en de linked_id gebruiken om de originele scene/comment te vinden.
Heeft iemand hier ervaring met zulke structuren? Wat zijn de voor en nadelen? Zijn er betere methoden dan wat ik van plan ben?
IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;