30. november 2003 - 21:50Der er
31 kommentarer og 1 løsning
Full-text search og danske tegn
Er det muligt at bruge full-text search til at søge på ord, der indeholder danske tegn skrevet som ø osv.?
Hvis jeg søger på fx. ordet "sætte" finder den ikke noget, og hvis jeg replacer æ med æ i søgestrengen finder den en masse som ikke indeholder ordet. Er det nogen løsning på dette?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Jeg har lige testet lidt og jeg har ikke problemer med at bruge fx: 'sætte' i en fulltext search. Men fulltext search finder jo ikke kun 100% matches, men også ord der ligner. Måske skal du bruge LIKE i stedet. Det virker også hos mig.
Det virker også med æ osv. men den finder alt for mange sider, som slet ikke indeholder ordet, og det duer jo ikke. Kan du ikke prøve, om din gør det samme, hvis du har en tabel med mange record med data i?
Jeg ved godt, at jeg kan bruge LIKE '%sætte%', men så har jeg ikke de samme muligheder som med MATCH-funktionen i full-text search.
Jeg har lige testet på en tabel med 215 records, hvor jeg lavede en testtabel med de samme data (blot med htmlentities). Når jeg eksempelvis søger på henholdsvis 'færreste' og 'færreste' i fulltext mode, får jeg 6 resultater i begge tilfælde (og de indeholder søgeordet). Så jeg kan ikke genskabe dit scenarie.
Indeholder dine felter æ, ø og å eller æ, æ og å når du tester?
Jeg har prøvet med LIKE og det virker som det skal. Hvis jeg søger på 'færreste' med full-text search, finder den 25 records, selvom ingen felter indeholder ordet. Med LIKE finder den ingenting.
Ja, den ene tabel indeholder: æ, æ og å, den anden: æ, ø og å og både fulltext og LIKE virker i begge tilfælde. Hvordan ser din querystring ud?
Noget tyder på, at det er mit full-text index, den er gal med. Har lige prøvet at kopiere nogle af felterne, som blev fundet over i en anden tabel og her finder den ikke noget. Jeg kigger lige nærmere på det...
Jeg har nu prøvet at indsnævre problemet, men er ikke rigtig blevet meget klogere... prøv følgende:
- Opret tabellen 'tabel': id (auto) og content (text) - Opret et full-text index på content-feltet - Opret tre records: 2 hvor content er blank og 1 hvor content er 'ø æ' - Kør 'SELECT id,MATCH (content) AGAINST ('færreste') FROM tabel;'
Det giver resultatet: *********************** ID - content 1 - 0,67756324121582 2 - 0 3 - 0 ***********************
Problemet er, at den finder feltet med 'ø æ' selvom det ikke indeholder 'færreste'.
12:42:22, 12:46:04, 12:51:17: Jeg har også en WHERE på, når jeg laver selve søgningen.
Det jeg mente med "Her finder den 25 records ud af 195..." var, at i 25 ud af 195 records, gav MATCH (body) AGAINST ('færreste') et tal der var større end nul (= søgeordet fundet i record'en)´ og det er jo ikke meningen.
"Jeg vil umiddelbart tro at problemet skyldes at fulltext som default har en grænseværdi på 50% og 'æ' er netop 50% af 'færreste'.": Er 50%-grænsen ikke hvis søgekriterierne er opfyldt i mere end 50% af records i tabellen. Det er de jo ikke her. Du kan også sagtens skrive en masse tekst i feltet og den vil søge forkert.´
"Læg også mærke til den lave værdi i 'content'": Hvis jeg opretter tre nye tomme records, stiger resultatet til 1,573253125842.
"Måske mine parametre er forskellige fra dine." Jeg har i samme værdier i SHOW VARIABLES som dig.
"Du kan måske prøve at eksperimentere med BOOLEAN MODE. " Jeg brugte BOOLEAN MODE til at starte med - den giver også forkert resultat i samme eksempel: 1 istedet for 0.
Øv øv, andre ideer til hvad der går galt? Det virker fint hvis jeg skriver "færreste" i et af felterne og søger på 'færreste'.
Jo, ved nærmere eftertanke har du ret i antagelsen omkring 50% af rækkerne. Jeg testede dit eksempel med BOOLEAN MODE og det virker faktisk, men du skal huske enkelte og dobbelte anførselstegn, som mit eks.: 14:16:28.
Men hvis jeg bruger dobbelte anførselstegn, vil jeg heller ikke kunne søge på flere ord, som ikke er skrevet i forlængelse af hinanden. Og jeg kan formentlig heller ikke kombinere det med *, + og - operatorerne m.v. Så er jeg vel egentlig helt tilbage til lige så godt kunne bruge LIKE, eller hvad?
Ja, personligt bruger jeg LIKE i mine søgninger, fordi den kan tilrettes mere præcist til mine behov og så er den hurtigere og mindre resourcekrævende. Måske bliver fulltext bedre i kommende versioner af MySQL, men som den er nu foretrækker jeg LIKE.
Ja, konklusionen må jo så være, at det faktisk ikke kan lave sig gøre... Så må jeg jo bruge LIKE istedet og undvære full-text-funktionerne. Så hvis en bruger søger på mere end ét ord, bliver din sql;
"SELECT id FROM tabel WHERE body LIKE '%" & ord1 & "%' OR '%" & ord2 & "%' osv.?
Ja, synes nu det er mærkeligt, at de ikke har lavet noget, der kan klare dette - de må da have samme problem i sverige? Men tak for forsøget.
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.