Avatar billede carparknorth Nybegynder
25. juni 2003 - 19:57 Der 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.
Avatar billede netro Nybegynder
25. juni 2003 - 20:52 #1
Kan du uddybe det lidt?

SQL = "Select From Tabel Where Kunstner Like '%" & Streng & "%'"
Avatar billede carparknorth Nybegynder
25. juni 2003 - 20:54 #2
ja, sådan har vi gjort det før. Vi vil gerne udnytte mySQL.

Har du været inde på www.cdskiven.dk?
Avatar billede netro Nybegynder
25. juni 2003 - 20:56 #3
Ja, jeg er fast kunde ;)
Avatar billede carparknorth Nybegynder
25. juni 2003 - 20:58 #4
ok. hvis du søger der får du kun kunstneren at se.

søg på davis miles eller miles davis og du får det samme resultat. Det gør det ikke med den SQL-streng ovenover. Hvordan laver man det i mySQL?
Avatar billede medions Nybegynder
25. juni 2003 - 21:06 #5
Avatar billede netro Nybegynder
25. juni 2003 - 21:06 #6
Nå, sådan mener du... Det er noget med match() against(). Kan ikke huske syntaksen. Har du prøvet at kigge her i øvrigt?

http://www.mysql.com/doc/en/Fulltext_Search.html
http://www.eksperten.dk/kat/26?searchtype=txt&words=fulltext&method=and&sort=score&catid=26
Avatar billede nielle Nybegynder
25. juni 2003 - 21:18 #7
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
Avatar billede carparknorth Nybegynder
26. juni 2003 - 00:19 #8
nielle... hva så hvis der er 3 navne i kunstneren?

netro: tak for dine links, jeg kigger på dem nu.

medions: jeg vil ikke bruge LIKE i sql, men bruge benytte mySQL til at gøre det, da det er hurtigere.
Avatar billede netro Nybegynder
26. juni 2003 - 03:04 #9
Så har jeg fundet mit MySQL-leksikon frem, så jeg kan give dig et ordentligt svar.

Det første, du skal gøre er at tilføje FullText-index til de kolonner, der skal søges i. Det gør du sådan:

Alter Table Tabelnavn Add FullText (Kolonne1, Kolonne2)

Syntaksen for FullText-søgning er (som jeg huskede):

Select * From Tabelnavn Where Match(Kolonne) Against('Søgeord')

Her vil posterne returneres med de mest relevante først.

Hvis du vil søge med flere ord, adskiller du dem med mellemrum:

Select * From Tabelnavn Where Match(Kolonne) Against('Søgeord1 Søgeord2')

Her vil poster, der indeholder alle søgeord, returneres først og dernæst poster, der kun indeholder ét ord eller nogle af ordene.

Du kan også få vist relevansen (Rel) af de fundne poster ved at udvælge Match...Against:

Select Kolonne, Match(Kolonne) Against('Søgeord1 Søgeord2') As Rel From Tabelnavn Where Match(Kolonne) Against('Søgeord1 Søgeord2')

FullText-søgning er ikke case-sensitive.

Håber det var brugbart :)
Avatar billede nielle Nybegynder
26. juni 2003 - 07:29 #10
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.
Avatar billede nielle Nybegynder
26. juni 2003 - 08:02 #11
...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

SQL = SQL & "' IN BOOLEAN MODE)"
Avatar billede netro Nybegynder
26. juni 2003 - 11:51 #12
BOOLEAN MODE kan vist kun bruges i MySQL 4.x
Avatar billede carparknorth Nybegynder
26. juni 2003 - 17:16 #13
nielle: jeg skrev først det med LIKE senere, jeg glemte det da jeg beskrev problemet. Sorry!

Men tak, jeg prøver jeres løsninger af. Vender tilbage senere.
Avatar billede nielle Nybegynder
26. juni 2003 - 17:40 #14
Der er skam no hard feelings. :^)

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.
Avatar billede netro Nybegynder
26. juni 2003 - 23:55 #15
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.
Avatar billede carparknorth Nybegynder
27. juni 2003 - 10:49 #16
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.
Avatar billede netro Nybegynder
27. juni 2003 - 15:00 #17
Det er helt fint med mig ;)
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
Kurser inden for grundlæggende programmering

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