Opret tre fuldtekstindekser
- a) en i søgeordskolonnen
- b) en i indholdskolonnen
- c) en på både søgeords- og indholdskolonnen
Derefter din forespørgsel:
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
Pointen er, at rel1
giver dig relevansen af din forespørgsel blot i keyword
kolonne (fordi du kun oprettede indekset på den kolonne). rel2
gør det samme, men for content
kolonne. Du kan nu tilføje disse to relevansscore sammen ved at anvende en hvilken som helst vægtning, du ønsker.
Du bruger dog ikke nogen af disse to indekser til den faktiske søgning. Til det bruger du dit tredje indeks, som er på begge kolonner.
Indekset på (søgeord, indhold) styrer din genkaldelse. Aka, hvad er returneret.
De to separate indekser (kun et på søgeord, et kun på indhold) styrer din relevans. Og du kan anvende dine egne vægtningskriterier her.
Bemærk, at du kan bruge et hvilket som helst antal forskellige indekser (eller variere de indekser og vægtninger, du bruger på forespørgselstidspunktet baseret på andre faktorer, måske ... søg kun på nøgleord, hvis forespørgslen indeholder et stopord ... reducer vægtningsbias for søgeord, hvis forespørgslen indeholder mere end 3 ord ... osv.).
Hvert indeks bruger diskplads, så flere indekser, mere disk. Og til gengæld højere hukommelsesfodaftryk for mysql. Indsættelser vil også tage længere tid, da du har flere indekser at opdatere.
Du bør benchmarke ydeevne (vær omhyggelig med at slå mysql-forespørgselscachen fra for benchmarking, ellers vil dine resultater blive skæve) til din situation. Dette er ikke Google-kvalitetseffektivt, men det er ret nemt og "ud af boksen", og det er næsten helt sikkert meget bedre end din brug af "synes godt om" i forespørgslerne.
Jeg synes, det fungerer rigtig godt.