sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag manipulera MySQL fulltext sökrelevans för att göra ett fält mer "värdefullt" än ett annat?

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.



  1. C# ringer oracle lagrad funktion

  2. Använd variabel inställd av psql-metakommando inuti DO-blocket

  3. Vilka är mer presterande, CTE eller temporära tabeller?

  4. Skickar parametrar till en JDBC PreparedStatement