sql >> Database teknologi >  >> RDS >> Mysql

Hvordan kan jeg manipulere MySQL fuldtekst søgerelevans for at gøre et felt mere 'værdifuldt' end et andet?

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.



  1. Få dagsnavnet fra en dato i PostgreSQL

  2. Hvordan skifter man databaser i postgres?

  3. Hvordan opgraderer man PostgreSQL fra version 9.6 til version 10.1 uden at miste data?

  4. Eksisterer / findes ikke:'vælg 1' vs 'vælg felt'