09. september 2010 - 11:23Der er
6 kommentarer og 1 løsning
MySQL: Fulltextsøgning med god relevans OG wildcards
Har lige haft success med at lave (rigtig) fulltext-søgning i min database : )
Der er jo grundlæggende 2 måder at søge på: NATURAL eller BOOLEAN - NATURAL leverer god relevans (en kort tekst med søgeordet scorer højere end en lang) - BOOLEAN kan bruge wildcards (*) - men leverer dårlig relevans (tæller blot matchende ord)
Er der en snedig måde at få kombineret de to søgemetoder, - så jeg både kan søge med wildcards OG få den gode relevans ?
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
Lidt ved siden af - men relevant alligevel, jeg havde bare ikke indset dette problem endnu : ) (At sortering pr. relevans er dyrt når der er MANGE hits)
I mit nuværende projekt vil jeg dog ikke ramme dette problem, da der aldrig vil være ret mange hits - nok max. 500 (7 9 13)..
Men metoden gør ikke noget ved den "grovkornede" relevansberegning fra BOOLEAN søgninger. Det jeg ønsker er den "følsomme" relevans fra NATURAL plus wildcards.
Jeg tænkte at man kunne kombinere 2 selects: En indre BOOLEAN som finder alle relevante, og så en ydre (som søger i den indres resultatliste) med samme MATCH streng, nu bare NATURAL. - Men den klager over at der ikke er noget fulltext-index for "dén kolonne" og det har den jo ret i : (
Jeg har søgt lidt rundt omkring, da jeg ikke lige selv er super stiv i søgning, og der ikke er så meget respons herinde, og selv om der ikke er noget af det der nok opnår præcist hvad du gerne vil, er flg. ment som evt. inspiration:
$Query = "SELECT *, match (data) against ('keyword, keyword1') as relevance from $TableName Where Match (data) against ('+keyword, +keyword1' IN BOOLEAN MODE) HAVING relevance > 0.2 order by relevance Desc";
diverse kombinationer af: - LIKE (for sammenligning med wildcards) - CASE (for at se om der er match på 'LIKE' og opbygge en 'relevancescore ud fra det, ved at lægge "1" til relevance scoren for hver gang LIKE matcher en del af strengen (omstændigt, besværligt og med garanti langsomt))
Hej ggxdg. Nej, jeg er heller ikek selv stødt på noget "ordentligt" (med "ren" mysql).
Tror bare jeg "nøjes" med den relevans som "boolean mode" leverer. - dog modereret sådan at dem med wildcard rankes ned og de "rene" hits op (med < og >)
Ej bare tag dem selv :) Jeg lærte lidt, men kunne ikke komme med nogen løsning...
Synes godt om
Ny brugerNybegynder
Din løsning...
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.