Skapa tre fulltextindex
- a) en i sökordskolumnen
- b) en i innehållskolumnen
- c) en i både sökords- och innehållskolumnen
Sedan, din fråga:
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
Poängen är att rel1
ger dig relevansen av din fråga bara i keyword
kolumn (eftersom du skapade indexet bara på den kolumnen). rel2
gör detsamma, men för content
kolumn. Du kan nu lägga till dessa två relevanspoäng tillsammans med vilken viktning du vill.
Du använder dock inte något av dessa två index för den faktiska sökningen. För det använder du ditt tredje index, som finns på båda kolumnerna.
Indexet på (sökord, innehåll) styr din återkallelse. Aka, vad är tillbaka.
De två separata indexen (ett endast på nyckelord, ett endast på innehåll) styr din relevans. Och du kan tillämpa dina egna viktningskriterier här.
Observera att du kan använda valfritt antal olika index (eller variera de index och viktningar du använder vid frågetillfället baserat på andra faktorer kanske ... sök bara på nyckelord om frågan innehåller ett stoppord ... minska viktningsbias för nyckelord om frågan innehåller mer än 3 ord ... etc).
Varje index använder upp diskutrymme, så fler index, mer disk. Och i sin tur högre minnesfotavtryck för mysql. Dessutom kommer infogning att ta längre tid eftersom du har fler index att uppdatera.
Du bör jämföra prestanda (var noga med att stänga av mysql-frågecachen för benchmarking, annars kommer dina resultat att bli skeva) för din situation. Det här är inte Google-betygseffektivt, men det är ganska enkelt och "out of the box" och det är nästan säkert mycket bättre än din användning av "gilla" i frågorna.
Jag tycker att det fungerar riktigt bra.