Avatar billede Slettet bruger
09. september 2010 - 11:23 Der 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 ?
Avatar billede ggxdg Nybegynder
09. september 2010 - 12:39 #1
Avatar billede Slettet bruger
09. september 2010 - 14:53 #2
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 : (
Avatar billede ggxdg Nybegynder
10. september 2010 - 09:33 #3
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))
Avatar billede ggxdg Nybegynder
10. september 2010 - 09:35 #4
fandt et eksempel på sidstnævnte:

http://www.sitepoint.com/forums/showthread.php?t=366485

selv om det virker utroligt u-elegant
Avatar billede Slettet bruger
13. september 2010 - 14:17 #5
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 >)

Læg et svar, så deler vi puljen, ikk :)
Avatar billede Slettet bruger
15. september 2010 - 13:30 #6
Hey ggxdg - læg et svar så du ka' få din hund!
Avatar billede ggxdg Nybegynder
15. september 2010 - 21:30 #7
Ej bare tag dem selv :)
Jeg lærte lidt, men kunne ikke komme med nogen løsning...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester