Ik heb een "soort van" forum gebouwd op ASP.NET Core met een MySQL database en ben nu bezig om de (momenteel extreem simpele) zoekfunctie iets uit te breiden.
De database structuur is ongeveer als volgt (alleen de relevante details)
Post (Id, ThreadId, Contents, CreatedTime)
Thread (Id, ForumId, Title)
Forum (Id, Title)
Zoals gewend dus een parent Forum tabel, met daarin meerdere Threads, en in elke thread weer meerdere Posts.
De huidige zoekfunctie komt neer op niks meer dan een select * from posts where contents like "%zoekterm%". Dit werkt OK maar is niet wat ik wil.
Ik wil minimaal het volgende:
- Mogelijkheid om meerdere zoektermen apart te zoeken (dus niet als een zin, maar elk woord apart)
- Sorteren op "relevantie", dwz resultaten waarin de meeste zoektermen voorkomen komen voor resultaten waarin er slechts 1 voorkomt.
- Of nog dieper: zoeken op resultaten die "ongeveer" matchen (fuzzy search dmv Levenstein distance oid).
- Paging (niet 30,000 resultaten op een pagina).
Hierdoor loop ik tegen een aantal problemen op:
1. Ik zou niet weten hoe ik de logica voor "zoeken naar meerdere termen ipv de hele zin", of nog erger de logica van fuzzy search, in een MySQL query zou moeten bouwen. Kan dat uberhaupt? Het lijkt me sterk. Het enige alternatief dat ik zie is om eerst ALLE posts op te halen, en ze daarna "aan de C# kant" te gaan filteren. Is dit hoe een search normaal werkt? Dit zal toch heel traag gaan worden voor groot aantal posts? In veel gevallen zal er misschien maar 1 post matchen, om dan een heel forum van honderdduizend posts te gaan ophalen lijkt niet handig...
2. Vergelijkbaar: hoe implementeer ik op de juiste manier paging indien ik eerst alle posts moet ophalen? Ik kan dus niet een "LIMIT" naar de database sturen omdat ik na de database query pas ga kijken hoeveel matches ik heb. Het resultaat is dat ik dus voor elke pagina opnieuw weer alle posts moet ophalen en moet filteren, om er daarna weer tig weg te gooien en een subset te laten zien.
Dit kan toch niet de bedoeling zijn?
Wat mis ik hier?
De database structuur is ongeveer als volgt (alleen de relevante details)
Post (Id, ThreadId, Contents, CreatedTime)
Thread (Id, ForumId, Title)
Forum (Id, Title)
Zoals gewend dus een parent Forum tabel, met daarin meerdere Threads, en in elke thread weer meerdere Posts.
De huidige zoekfunctie komt neer op niks meer dan een select * from posts where contents like "%zoekterm%". Dit werkt OK maar is niet wat ik wil.
Ik wil minimaal het volgende:
- Mogelijkheid om meerdere zoektermen apart te zoeken (dus niet als een zin, maar elk woord apart)
- Sorteren op "relevantie", dwz resultaten waarin de meeste zoektermen voorkomen komen voor resultaten waarin er slechts 1 voorkomt.
- Of nog dieper: zoeken op resultaten die "ongeveer" matchen (fuzzy search dmv Levenstein distance oid).
- Paging (niet 30,000 resultaten op een pagina).
Hierdoor loop ik tegen een aantal problemen op:
1. Ik zou niet weten hoe ik de logica voor "zoeken naar meerdere termen ipv de hele zin", of nog erger de logica van fuzzy search, in een MySQL query zou moeten bouwen. Kan dat uberhaupt? Het lijkt me sterk. Het enige alternatief dat ik zie is om eerst ALLE posts op te halen, en ze daarna "aan de C# kant" te gaan filteren. Is dit hoe een search normaal werkt? Dit zal toch heel traag gaan worden voor groot aantal posts? In veel gevallen zal er misschien maar 1 post matchen, om dan een heel forum van honderdduizend posts te gaan ophalen lijkt niet handig...
2. Vergelijkbaar: hoe implementeer ik op de juiste manier paging indien ik eerst alle posts moet ophalen? Ik kan dus niet een "LIMIT" naar de database sturen omdat ik na de database query pas ga kijken hoeveel matches ik heb. Het resultaat is dat ik dus voor elke pagina opnieuw weer alle posts moet ophalen en moet filteren, om er daarna weer tig weg te gooien en een subset te laten zien.
Dit kan toch niet de bedoeling zijn?
Wat mis ik hier?