25. juni 2003 - 19:57Der er
15 kommentarer og 2 løsninger
MySQL søgning
Hej.
Vi vil lave en søgemaskine til vores side. Den skal søge i en mySQL database, i en tabel med over 50.000 poster i. Det er kunstner-navne der er søges på.
Tabellen har følgende: ID,Kunstner,Album,Genre
Kunstner og Album er lavet til FullText.
Prøv at gå ind på www.cdskiven.dk og søg på davis miles. Så får man kun kunstneren Miles Davis at se. Vi vil gerne lave en tilsvarende.
Vi har brug for både sql-strengen og lidt ASP-kode.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Artist = "Miles Davis" ArtistParts = split(Artist, " ")
SQL = "SELECT * FROM ArtistTable WHERE"
FirstPart = true for each Part in ArtistParts if FirstPart then SQL = SQL & " Kunstner LIKE '%" & Part & "%'" FirstPart = false else SQL = SQL & " AND Kunstner LIKE '%" & Part & "%'" end if next
carparknorth -> Min løsning fungere skam uden problemer uanset om der er 1, 2, 3 eller for den sags skyld 15 navne i kunstneren.
Split'en deler navnet op ved mellemrum. for-each løber så igennem hvert navn og lægger et nyt LIKE til. Så snart at der mere end 1 komponent skydes der også en AND ind før det næste led.
...men hvis du ikke vil bruge LIKE (det burde du jo så have nævnt!) så kan du bruge en løsning lavet over MATCH-AGAINST. Hvis du f.eks. vil finde Miles Davies, så kunne SQL'en se således ud:
SELECT * FROM ArtistTable WHERE MATCH (Kunstner) AGAINST ('+Davies +Miles' IN BOOLEAN MODE)
Denne kan dannes via en variation på min ASP kode:
Artist = "Davis Miles" ArtistParts = split(Artist, " ")
SQL = "SELECT * FROM ArtistTable WHERE MATCH(Kunstner) AGAINST ('"
FirstPart = true for each Part in ArtistParts if FirstPart then SQL = SQL & "+' & Part FirstPart = false else SQL = SQL & " +' & Part end if next
Nu ved jeg ikke om du bruger MySQL 4.0.1 eller senere (for netro har ret i at det først er derfra at BOOLEAN MODE kan bruges). De andre forslag vil medtage en del andre hits, som bare ligner overfladisk (glimrende vist på et af netros links: http://www.mysql.com/doc/en/Fulltext_Search.html). Sådan som jeg læser dit oprindelige spørgsmål, vil min LIKE-version komme tættest på det du ønsker.
Men selv om du skulle ende med en MATCH-AGAINST løsning (som burde være lidt hurtigere) så kan min for-each konstruktion bruges på dem alle sammen.
Nu har jeg leget lidt med det i mit eget testmiljø med en v. 3.23, og det undrer mig faktisk, at ingen poster returneres, hvis der fx. søges med Match...Against('gul sort hvid'), når posten findes.
FullText indekserer kun ord på min. 3 tegn, men det kan du ændre i my-filen. Hvis flere end halvdelen af posterne i tabellen matcher, returneres ingen, da det betragtes som uspecifik søgning.
tak for al jeres hjælp. Jeg endte med at bruge LIKE funktionen alligevel. Nielles funktion virker perfekt til min database, så det var rigtigt lækkert. Tilgengæld bruger jeg MATCH-AGAINT på en anden side i mit system. Netro --> tak for al din hjælp.
Håber det er i orden med point fordelingen, ellers må I sige til.
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.