Avatar billede wermelin Nybegynder
07. marts 2001 - 10:28 Der er 38 kommentarer og
1 løsning

Søge på 2 ord!

Hejsan!

Hvordan får jeg min søgemaskine til ar søge på fx. 2 ord??
Altså; når brugeren indtaster \'sko + nike\' så søger den på begge ord seperat.

Er der nogen der ligge kan komme med et hint eller lidt kode... :o)

- Wermelin
Avatar billede limemedia Nybegynder
07. marts 2001 - 10:31 #1
seperer din query på alle seperatortegn (komma, space, bindestreg m.v.) og lig disse ind i et array... din sql laver du så hvor ord er like %query% hvor quert er det enkelte ord... lav det som en OR søgning.
Avatar billede nute Nybegynder
07. marts 2001 - 10:31 #2
denne SQL skulle kunne hjelpe deg

SELECT * FROM [din tabell] WHERE [kolonne] LIKE \'SKO\' AND [kolonne] LIKE \'nike\'

/nute
Avatar billede nute Nybegynder
07. marts 2001 - 10:32 #3
sorry... -->

SELECT * FROM [din tabell] WHERE [kolonne] LIKE \'SKO\' OR [kolonne] LIKE \'nike\'

/nute

Avatar billede limemedia Nybegynder
07. marts 2001 - 10:37 #4
SELECT * FROM [din tabell] WHERE [kolonne] LIKE \'%SKO%\' AND [kolonne] LIKE \'%nike%\'

du skal gentage AND [kolonne] LIKE \'%nike%\' efter antal querywords
Avatar billede wermelin Nybegynder
07. marts 2001 - 10:42 #5
Okaaay..... hmmm....
Jeg har følgende linie i min sqlstreng:
    strSQL = strSQL & \" AND (VARENAVN = \'\" & strKEYWORD & \"\' OR VAREBESKRIVELSE LIKE \'%\" & strKEYWORD & \"%\')\"

Hvor strKEYWORD er søgeordet hentet fra søgeformen! Men hvordan deler jeg det op hvis der er indtastet 2 ord i søgeformen?
Skal lige siges, at strKEYWORD skal være ligmed VARENAVN og kun LIKE VAREBESKRIVELSE - altså dvs. at de 2 ord som brugeren indtaster skal køre igennem både VARENAVN og VAREBESKRIVELSE kolonnerne!
Avatar billede nute Nybegynder
07. marts 2001 - 10:43 #6
ljweb >> du undergraver jo ditt eget svar tidligere med bruk av OR ;) men det er en detalj...

wermelin >> det som du bør være oppmerksom på er at ljweb sin sql søker på alle entries som inneholder ordet \'sko\' eller \'nike\' noe som vil gi deg en hel masse treff enn hvis du søker uten wildcard (lik mitt svar)...du kan benytte wildcards på denne måte også:

\'%sko\' --> alle ord som slutter med \'sko\'
\'sko%\' --> alle ord som starter med \'sko\'

/nute
Avatar billede nute Nybegynder
07. marts 2001 - 10:46 #7
strKEYWORD = request.form(\"KEYWORD\")

Dim arrWords = split( strKEYWORD,\"+\" )

deretter kjører du en loop hvor du legger til søkeordene i din SQL

/nute
Avatar billede limemedia Nybegynder
07. marts 2001 - 10:47 #8
nute >> jeg opdagede min fejl... selvfølgelig skal den søge AND og ikke OR... jeg er lidt miljøskadet efter min seneste søgning der netop skulle bruge OR...

wermelin >> jeg er ikke hjemme i ASP... i PHP vil jeg bruge explode kommandoen :)))) *gg*
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:06 #9
nute>> Jeg får fejl efter jeg har gjort sådan!

Dim arrWords = split( strKEYWORD,\"+\" )


\' Her kommer SQLstrengen!
strSQL = \"SELECT * FROM VARE WHERE\"
IF strAMTKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AMT LIKE \'%amt%\'\"
ELSE
    strSQL = strSQL & \" AMT = \'\" & strAMTKEYWORD & \"\'\"
END IF
.
.
.
    strSQL = strSQL & \" AND (VARENAVN = \'\" & arrWords & \"\' OR VAREBESKRIVELSE LIKE \'%\" & arrWords & \"%\')\"

Fejlen lyder:
Slut på sætning var ventet
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:11 #10
Jeg har fjernet Dim - så nu får jeg fejlen:
Typerne stemmer ikke overens
Avatar billede nute Nybegynder
07. marts 2001 - 11:12 #11
din loop skal e nogenlunde sånn ut:

if len( arrWords ) >= 1 then
  strSQL = \"...WHERE VARENAVN LIKE \'\" & arrWords(1) & \"\'\"
  for i = 2 to len(arrWords)
    strSQL = strSQL & \" OR VARENAVN LIKE \'\" & arrWords(i) & \"\'\"
  next
end if

hvis dette ikke fungerer, skriv ut din sql streng så vi kan se hvordan den ser ut...

/nute

Avatar billede wermelin Nybegynder
07. marts 2001 - 11:20 #12
Jeg kan ikke få lov til at udskrive sqlstrengen for jeg får denne fejl:
Typerne stemmer ikke overens: \'arrWords\'

Avatar billede wermelin Nybegynder
07. marts 2001 - 11:23 #13
Fejlen ligger i denne linie:
IF len(arrWords) >= 1 THEN
Avatar billede nute Nybegynder
07. marts 2001 - 11:26 #14
aahhh...sorry....

sett inn

if UBOUND(arrWords) >= 1 then

istedenfor

/nute
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:34 #15
Koden nu:
DIM arrWords
arrWords = split( strKEYWORD,\"+\")

\' Her kommer SQLstrengen!
strSQL = \"SELECT * FROM VARE WHERE\"
IF strAMTKEYWORD = \"ALLE\" THEN
    strSQL = strSQL & \" AMT LIKE \'%amt%\'\"
ELSE
    strSQL = strSQL & \" AMT = \'\" & strAMTKEYWORD & \"\'\"
END IF
.
.
.
.
IF UBOUND(arrWords) >= 1 THEN 
    strSQL = strSQL & \" AND (VARENAVN = \'\" & arrWords(1) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & arrWords(1) & \"%\')\"
FOR i = 2 TO UBOUND(arrWords)
    strSQL = strSQL & \" AND (VARENAVN = \'\" & arrWords(i) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & arrWords(i) & \"%\')\"
NEXT
END IF

Men nu kører den ikke løkken igennem...
strSQL = SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:34 #16
Hmm.... nu sådan:
SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN AND \' nike\' OR VAREBESKRIVELSE LIKE \'% nike%\')
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:35 #17
Og der har jeg søgt på \'sko + nike\'
Avatar billede nute Nybegynder
07. marts 2001 - 11:38 #18
din SQL ser fornuftig ut...MEN din :

AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\')

skal være:

AND (BY LIKE \'%a%\' OR BY LIKE \'%e%\' OR BY LIKE \'%i%\' OR BY LIKE \'%o%\' OR BY LIKE \'%u%\' OR BY LIKE \'%ø%\' OR BY LIKE \'%æ%\' OR BY LIKE \'%å%\')

(( personlig synes jeg den er litt \"latterlig\" for den vil jo returnere *alle* byene som inneholder minst én av disse bokstavene ))

/nute

Avatar billede nute Nybegynder
07. marts 2001 - 11:40 #19
omskriv din

IF..THEN til dette:

IF UBOUND(arrWords) >= 1 THEN 
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(1)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(1)) & \"%\')\"
FOR i = 2 TO UBOUND(arrWords)
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\')\"
NEXT
END IF

/nute
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:40 #20
Har fundet ud af - at hvis jeg søger på ét ord, så går den ikke igennem her løkken!

Men kun når jeg skriver \'+\' - så går den igennem, men søger faktisk ikke i db\'en, men tager alle poster fra db\'en.... I\'m lost!!
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:44 #21
Nu fungerer det hvis man søger på 2 ord med +! Men hvis man kun søger på ét ord så hopper den ikke igennem din løkken :o)
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:46 #22
Hmm..... nu har jeg skrevet \'sko+tennissokker\' og får denne sql;
SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN = \'tennissokker\' OR VAREBESKRIVELSE LIKE \'%tennissokker%\')

Dvs. at den KUN søger på alt efter +\'et.. hmm...?!?
Avatar billede nute Nybegynder
07. marts 2001 - 11:47 #23
jammen det er klart...

normalt vil jo en søkemaskin fungere sånn at når man skriver

sko+nike

så vil den søke etter alle entries som har nøyaktig strengen

skriver man

sko AND nike

så vil den søke etter alle entries som har begge ord

skriver man fx

sko nike

så vil man søke etter alle entries som inneholder begge ord...

det er ikke bare å lage en søkemaskin og tilleffe den en hel masse funksjonalitet....det krever en hel del filtrering av søkeordene, pluss at man skal validere søkestrengen opp mot en hel del regler som man har definert....

/nute
Avatar billede wermelin Nybegynder
07. marts 2001 - 11:52 #24
Ok!

Men hvis jeg siger at jeg vil have det sådan at når man søger på \'sko\' og \'nike\' - så skal den søge igennem med \'sko\' i VARENAVN og VAREBESKRIVELSE og udskrive alle poster der indeholder \'sko\'. Bagefter skal den tage \'nike\' og gøre nøjagtigt det samme.
Dvs. at brugeren får alle poster der indeholder ordet \'sko\' og eller poster der indeholder ordet \'nike\'!

Hvilken seperator skal jeg så bruge: +, AND, (mellemrum!) eller en helt tredje??

Håber virkelig du har svaret :o)
Avatar billede nute Nybegynder
07. marts 2001 - 12:01 #25
for å gjøre det enkelt, ville jeg bare tillate å søke på

\'sko nike\' UTEN \'AND\', \'OR\', \'+\' eller noe annet...deretter splitter du bare din søkestreng på mellomrom:

Dim arrWords = split( strKEYWORD,\" \" )

din loop skal faktisk se sånn ut:

arrLenght = UBOUND(arrWords)
IF arrLenght >= 1 THEN 
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(1)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(1)) & \"%\' \"
  IF arrLenght <= 1 THEN
    strSQL = strSQL & \")\"
  ELSE
    FOR i = 2 TO UBOUND(arrWords)
      strSQL = strSQL & \" OR VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\'\"
    NEXT
    IF i = arrLength THEN
      strSQL = strSQL & \")\"
    END IF
  END IF
END IF

/nute

Avatar billede wermelin Nybegynder
07. marts 2001 - 13:02 #26
nute>> Undskyld jeg ikke har svaret dig - men har lige været til frokost!
Jeg har prøvet at sætte din kode ind - og den fungerer uden fejl, og dog....
.. for når jeg søger på \'sko nike\' - bruger den KUN \'nike\' som søgeord - og ikke \'sko\'. Se her:
SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN = \'nike\' OR VAREBESKRIVELSE LIKE \'%nike%\' )
Hvorfor gør den kun det??

Og hvis jeg kun skriver \'sko\' (altså kun 1 ord som søgeord!) så søger den slet ikke efter søgeordet. Se her:
SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53
Hvorfor det?

Avatar billede nute Nybegynder
07. marts 2001 - 13:06 #27
skriv

response.write \"--> \" & UBOUND(arrWords)

etter din

arrLenght = UBOUND(arrWords)

for å se lengden på din array

(og søk på \'sko nike\'...du bør få \'--> 2\' som resultat)

/nute

Avatar billede wermelin Nybegynder
07. marts 2001 - 13:17 #28
Øhh... resultat: \'--> 1\' :o)
Avatar billede nute Nybegynder
07. marts 2001 - 13:21 #29
skriv ut din array for å se hva som ligger i den...

for i = 0 to UBOUND(arrWords)
  response.write \"--> \" & arrWords(i) & \"<br>\"
next

(( jeg husker ikke helt om en array i ASP starter med 0 eller 1, men prøv deg fram ))

/nute
Avatar billede wermelin Nybegynder
07. marts 2001 - 13:35 #30
Jeg har lavet lidt om:
arrLenght = UBOUND(arrWords)
Response.write \"<br><br><br>\"
response.write \"--> \" & UBOUND(arrWords)
IF arrLenght >= 0 THEN 
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\') \"
  IF arrLenght <= 1 THEN
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(1)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(1)) & \"%\') \" 
  ELSE
    FOR i = 2 TO UBOUND(arrWords)
    strSQL = strSQL & \" OR VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\'\"
    NEXT
    IF i = arrLength THEN
      strSQL = strSQL & \")\"
    END IF
  END IF
END IF

Og når jeg søger på \'sko nike\' får jeg rigtigt resultat og sql\'en ser sådan ud men - men respons.write arrLenght er stadigvæk 1:
--> 1


SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND POSTNR BETWEEN 100 AND 10000 AND UGE BETWEEN 0 AND 53 AND (VARENAVN = \'sko\' OR VAREBESKRIVELSE LIKE \'%sko%\') AND (VARENAVN = \'nike\' OR VAREBESKRIVELSE LIKE \'%nike%\')

Når jeg så kun søger på 1 ord får jeg en fejl:
Indekset er uden for området: \'[number: 1]\'

Avatar billede nute Nybegynder
07. marts 2001 - 13:40 #31
hva sier

response.write UBOUND(arrWords)

når du kun søker på et ord ?

/nute
Avatar billede wermelin Nybegynder
07. marts 2001 - 13:40 #32
Men uanset hvordan vi skriver det - så må fejlen jo være her
DIM arrWords
arrWords = split( strKEYWORD,\" \")
et sted - for det er som om at den ikke kan tælle at der er mere end 1 ord.... eller hva\'?
Avatar billede wermelin Nybegynder
07. marts 2001 - 13:43 #33
Nu har jeg den... du får lige koden om 2 sec... :o)
Avatar billede wermelin Nybegynder
07. marts 2001 - 13:47 #34
Array starter på 0 - dvs. 1 søgeord = 0 og 2 søgeord = 1 osv osv.

Jeg har forkortet koden lidt så nu ser den sådan ud - og den virker! :O)
arrLenght = UBOUND(arrWords)
IF arrLenght = 0 THEN 
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\') \"
ELSE
    FOR i = 0 TO UBOUND(arrWords)
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\') \"
    NEXT
    IF i = arrLength THEN
      strSQL = strSQL & \")\"
    END IF
END IF
Avatar billede nute Nybegynder
07. marts 2001 - 13:48 #35
flott... :)
Avatar billede wermelin Nybegynder
07. marts 2001 - 14:10 #36
Heh... der en lille bug!
Hvis jeg fx. søger på 2 ord som KUN findes i VARENAVN kolonnen fx. \'sko tennissokker\' så får jeg følgende sqlstreng:

SELECT * FROM VARE WHERE AMT LIKE \'%amt%\' AND (BY LIKE \'%a%\' OR \'%e%\' OR \'%i%\' OR \'%o%\' OR \'%u%\' OR \'%ø%\' OR \'%æ%\' OR \'%å%\') AND KATEGORI LIKE \'%beklædning%\' AND (POSTNR BETWEEN 100 AND 10000) AND (UGE BETWEEN 0 AND 53) AND (VARENAVN = \'sko\' OR VAREBESKRIVELSE LIKE \'%sko%\') AND (VARENAVN = \'tennissokker\' OR VAREBESKRIVELSE LIKE \'%tennissokker%\')

Og min egen streng: Søgningen på \'sko tennissokker\' gav intet resultat!

Men sqlstrengen ser da rigtig ud ikke! Den burde tage alle poster med VARENAVN=sko og alle poster med VARENAVN=tennissokker ikke??

Hmm....?
Avatar billede nute Nybegynder
07. marts 2001 - 14:15 #37
prøv denne heller:

arrLenght = UBOUND(arrWords)
IF arrLenght = 0 THEN 
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\') \"
ELSE
    strSQL = strSQL & \" AND (VARENAVN = \'\" & trim(arrWords(0)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(0)) & \"%\'\"
    FOR i = 0 TO UBOUND(arrWords)
    strSQL = strSQL & \" OR (VARENAVN = \'\" & trim(arrWords(i)) & \"\' OR VAREBESKRIVELSE LIKE \'%\" & trim(arrWords(i)) & \"%\' \"
    NEXT
    IF i = arrLength THEN
      strSQL = strSQL & \")\"
    END IF
END IF


dessuten bør du lese min posting klokken 07/03 2001 11:38:34 

/nute
Avatar billede wermelin Nybegynder
07. marts 2001 - 14:28 #38
Heh.. den med BY osv... Ja, det er også meningen at den skal retunere ALLE byerne :o) Brugeren kan enten vælge en specifik by eller valgmuliheden --ALLE BYER -- og så for at få alle byerne med, så tog jeg bare vokalerne - for der findes jo mindst én vokal i et ord :o)

Og den nye kode du kom med - virkede; jeg skulle dog fjerne
NEXT
    IF i = arrLength THEN
      strSQL = strSQL & \")\"
    END IF
og tilføje en ) på de andre linie :o)

Du er en gud - norsk gud!!
Avatar billede nute Nybegynder
07. marts 2001 - 14:30 #39
hyggelig å kunne hjelpe dere dansker ;)
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