18. september 2007 - 17:40Der er
16 kommentarer og 1 løsning
Tæl "hits"
Hej!
Jeg har lavet et lille søgesystem i MySQL som søger nogle kolonner igennem efter et søgeord. Hvis søgeordet foreksempel er "harry potter" vil jeg gerne have at resultater hvor både harry og potter indgår kommer først. Hvordan får tæller jeg hvilken række i tabellen, der har givet flest resultater?
Du bliver nødt til at lave et sql statement som smider ind i en database at under søgningen på harrypotter er der x antal hits Du skal jo registrer på en eller anden måde hvor mange gange der er blevet spurgt i databasen...
Nej, MySQL giver ikke oplysninger om hvormange ord der passer på dine regexp.
I den kode jeg gav, får du heller ikke antal hits,men du får sorteret søgeresultaterne efter hvilk der er mest relevante først - dvs. dem som hitter på flest af ordene.
Hvis du vil have hitsene, er du nødt til at tælle dem op i din PHP kode. Og så er det jo en fordel at have de mest relevante øverste sådan at man ikke også skal igang med at sortere i PHP-koden.
- levere et tal, og dette bliver så kendt under aliaset "relevans". Du kan efterfølgende udtrække det ved noget i stil med $row["relevans"] hvis du ønsker
Det vigtigste er dog ikke om du kan udtrække relevansen (selv om det f.eks. giver dig mulighed for at sætte en rating på et hit), men at du med "... ORDER BY relevans DESC" får sorteret hitsen med den største relevans først.
Nu har jeg lavet en forespørgsel, som til dels virker:
SELECT *, MATCH (title, abstract, keywords, author) AGAINST ('$term') AS relevancy FROM article ORDER BY relevancy DESC
Når jeg så for eksempel søger på en forfatter (author) virker det nogengange. Der er for eksempel fire artikler. To skrevet af Christian, en af Thomas, og en af dem begge. Hvis man søger på Thomas får de to sidstnævnte en værdi i relevancy, men hvis man søger på Christian får ingen artikler nogen relevancy-værdi. Hvorfor det?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.