FULLTEXT Search
steen
28/09/2009 19:30:00Beste PHP'ers,
Klein probleempje:
Ik had een database netjes in elkaar gezet, daarna heb ik een Fulltext search gemaakt:
SELECT * FROM tabel MATCH(veld1,veld2,veld3,auteur,inhoud) AGAINST ("trefwoord")
Op zich werkte dat goed, maar nu heb ik het veld 'auteur' in een apparte tabel gezet. Nu zou het zo kunnen zijn dat ik twee query's uitvoer en dan de query's samenvoeg, maar hoe doe ik dit? En wat moet ik daarvoor met de 'auteurs'-tabel doen?
Klein probleempje:
Ik had een database netjes in elkaar gezet, daarna heb ik een Fulltext search gemaakt:
SELECT * FROM tabel MATCH(veld1,veld2,veld3,auteur,inhoud) AGAINST ("trefwoord")
Op zich werkte dat goed, maar nu heb ik het veld 'auteur' in een apparte tabel gezet. Nu zou het zo kunnen zijn dat ik twee query's uitvoer en dan de query's samenvoeg, maar hoe doe ik dit? En wat moet ik daarvoor met de 'auteurs'-tabel doen?
PHP hulp
21/11/2024 15:17:35Vraag hoe kan je netjes (InnoDB) en fulltext (MyISAM) combineren.
Misschien iets met een OR id IN (SELECT * FROM andere tabell...........)
Misschien iets met een OR id IN (SELECT * FROM andere tabell...........)
steen
28/09/2009 19:58:00Ik dacht aan twee keer fulltext en dan combineren, dus op beide tabellen, maar dat combineren, hoe moet dat? Dat is mijn vraag.
2 rowsets combineer met je UNION; eis is dat gelijke columncount hebt; columns worden op nummer samengevoegd
Jan Koehoorn
28/09/2009 21:59:00Je kunt inderdaad twee FULLTEXT indexes maken. Daarna wordt je query zo:
Getest met twee tabellen, schrijvers en boeken.
Edit: nog even gekeken, en deze werkt nog iets beter:
Immers, als de gezochte string in beide velden voorkomt is het zoekresultaat relevanter. Je hebt in dit geval wel die ORDER BY nodig, want MySQL doet de sortering op deze manier niet meer automatisch.
Code (php)
1
2
3
4
5
2
3
4
5
SELECT s.naam, b.titel
FROM schrijvers AS s
LEFT JOIN boeken AS b ON s.id = b.schrijver_id
WHERE MATCH(naam) AGAINST('wolkers')
OR MATCH(titel) AGAINST('wolkers')
FROM schrijvers AS s
LEFT JOIN boeken AS b ON s.id = b.schrijver_id
WHERE MATCH(naam) AGAINST('wolkers')
OR MATCH(titel) AGAINST('wolkers')
Getest met twee tabellen, schrijvers en boeken.
Edit: nog even gekeken, en deze werkt nog iets beter:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT s.naam, b.titel,
MATCH(naam) AGAINST('wolkers') + MATCH(titel) AGAINST('wolkers') AS score
FROM schrijvers AS s
LEFT JOIN boeken AS b ON s.id = b.schrijver_id
WHERE MATCH(naam) AGAINST('wolkers')
OR MATCH(titel) AGAINST('wolkers')
ORDER BY score DESC
MATCH(naam) AGAINST('wolkers') + MATCH(titel) AGAINST('wolkers') AS score
FROM schrijvers AS s
LEFT JOIN boeken AS b ON s.id = b.schrijver_id
WHERE MATCH(naam) AGAINST('wolkers')
OR MATCH(titel) AGAINST('wolkers')
ORDER BY score DESC
Immers, als de gezochte string in beide velden voorkomt is het zoekresultaat relevanter. Je hebt in dit geval wel die ORDER BY nodig, want MySQL doet de sortering op deze manier niet meer automatisch.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn