Maak drie volledige tekstindexen
- a) één in de zoekwoordkolom
- b) één in de inhoudskolom
- c) één voor zowel de zoekwoord- als de inhoudskolom
Dan uw vraag:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC
Het punt is dat rel1
geeft u de relevantie van uw zoekopdracht alleen in het keyword
kolom (omdat u de index alleen voor die kolom hebt gemaakt). rel2
doet hetzelfde, maar voor de content
kolom. U kunt deze twee relevantiescores nu bij elkaar optellen en elke gewenste weging toepassen.
U gebruikt echter geen van deze twee indexen voor de daadwerkelijke zoekopdracht. Daarvoor gebruik je je derde index, die op beide kolommen staat.
De index op (trefwoord, inhoud) regelt uw terugroepactie. Aka, wat wordt geretourneerd.
De twee afzonderlijke indexen (één op trefwoord alleen, één op inhoud alleen) bepalen uw relevantie. En u kunt hier uw eigen wegingscriteria toepassen.
Houd er rekening mee dat u een willekeurig aantal verschillende indexen kunt gebruiken (of de indexen en wegingen die u tijdens het zoeken gebruikt kunt variëren op basis van andere factoren misschien ... zoek alleen op trefwoord als de zoekopdracht een stopwoord bevat ... verminder de wegingsbias voor trefwoorden als de zoekopdracht meer dan 3 woorden bevat ... enz.).
Elke index verbruikt schijfruimte, dus meer indexen, meer schijf. En op zijn beurt een hogere geheugenvoetafdruk voor mysql. Het invoegen duurt ook langer, omdat u meer indexen moet bijwerken.
U moet de prestaties benchmarken (zorg ervoor dat u de mysql-querycache uitschakelt voor benchmarking, anders worden uw resultaten scheef) voor uw situatie. Dit is niet efficiënt voor Google, maar het is vrij eenvoudig en "out of the box" en het is vrijwel zeker een stuk beter dan uw gebruik van "vind ik leuk" in de zoekopdrachten.
Ik vind dat het heel goed werkt.