sql >> Database >  >> RDS >> Mysql

Hoe kan ik de relevantie van MySQL-zoekopdrachten in volledige tekst manipuleren om het ene veld 'waardevoller' te maken dan het andere?

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.



  1. Het verschil tussen primaire sleutel en unieke sleutel

  2. MySQL-query / uitvoeringsvolgorde van de clausule

  3. Replicatie-failover voor MySQL en MariaDB beheren

  4. Verschil tussen numeriek, zwevend en decimaal in SQL Server