Avatar billede sark Nybegynder
14. juni 2001 - 02:08 Der er 17 kommentarer

SQL søgninge tager for langt tid

DErfor vil jeg gerne have noget hjælp til dette da det skulle kunne klare problemmet

http://www.mysql.com/doc/F/u/Fulltext_Search.html
Avatar billede alvion Nybegynder
14. juni 2001 - 07:09 #1
Så er du kommet det rette sted hen... :-)
Jeg gætter på at du sikkert idag bruger en

select * from din-tabel
where tekstfelt1 like \'%søgetekst%\'
or tekstfelt2 like \'%søgetekst%\'
or tekstfelt3 like \'%søgetekst%\'
osv...

ikke?

Det du gør er følgende:

1) Opret et fulltext indeks med følgende kommando:

CREATE FULLTEXT INDEX ft ON din-tabel (tekstfelt1, tekstfelt2, tekstfelt3);

Du skal medtage alle de tekstfelter, som du ønsker at kunne søge i. Kun felter af type TEXT eller VARCHAR kan medtages - altså *ikke* CHAR.


2) Søg i tabellen med følgende sætning:

SELECT * FROM din-tabel WHERE MATCH(tekstfelt1, tekstfelt2, tekstfelt3) AGAINST (\'et eller flere søgeord\');

Hvis der angives flere søgeord (skal adskilles med mellemrum) laves automatisk en \"or\" sammenligning. I en senere version af MySQL får man mulighed for at vælge mellem \"and\" og \"or\".

I MATCH parantesen *skal* du medtage alle de tekstfelter, som du specificerede i din CREATE INDEX.
Avatar billede henrik_ffc Nybegynder
14. juni 2001 - 09:33 #2
Cool.

Der lærte jeg lige noget nyt....
Avatar billede alvion Nybegynder
14. juni 2001 - 09:36 #3
Det er fulltext indekset jeg har brugt til at lave søgemaskinen her på Eksperten.
Avatar billede sark Nybegynder
14. juni 2001 - 10:57 #4
Du har ret i at jeg gør det med ovenstående eksempel... men vhorofr skulle dette være hurtigere ?
Avatar billede sark Nybegynder
14. juni 2001 - 11:02 #5
Faktisk ser min SQL sætning sådan ud

        $sogtemp = explode(\" \", $author);
        $samlet = count($sogtemp);
        $q= \"SELECT authorid FROM author WHERE\";
        for ($i = 0; $i < $samlet; ++$i) {
        if ($last) $q .= \" or \";
        $q .= \" name LIKE \'%$sogtemp      [$i]%\'\";
        $last = \"1\";
        }
Vil det stadig kunne hjælpe ?
Avatar billede alvion Nybegynder
14. juni 2001 - 11:11 #6
Hvis du bruger \"LIKE \'%etellerandet%\'\" så kan du ikke bruge nogen form for indeks. Det betyder at MySql skal læse *alle* records i tabellen igennem for at finde dem der passer.

FULLTEXT indekset opretter en ord-liste, som der så kan søges i meget hurtigt. Fra denne ordliste er der så direkte \"pegepinde\" til de records, som indeholder ordet. Samtidig bliver resultatet automatisk sorteret således at de records, som indeholder ordet flere gange, ligger først.
Avatar billede alvion Nybegynder
14. juni 2001 - 11:13 #7
$q = \"SELECT authorid FROM author \";
$q .= \"WHERE MATCH(name) AGAINST (\'$author\')\";

burde gøre tricket (jeg formoder at ordene i $author er adskildt af mellemrum - det skal de være når man søger i FULLTEXT)
Avatar billede sark Nybegynder
14. juni 2001 - 11:15 #8
Hvad kan jeg så gøre for at få den hurtigere
Avatar billede alvion Nybegynder
14. juni 2001 - 11:17 #9
Jamen FULLTEXT indekset *er* det hurtigste :-)
Avatar billede sark Nybegynder
14. juni 2001 - 11:20 #10
Kan jeb bruge det i dette tilfælde ?
Avatar billede sark Nybegynder
14. juni 2001 - 11:34 #11
Prøv at se her...
hvad er der galt ?

CREATE FULLTEXT INDEX ft ON author (name);

MySQL said: You have an error in your SQL syntax near \'FULLTEXT INDEX ON author (name);\' at line 1


name er varchar 70
Avatar billede alvion Nybegynder
14. juni 2001 - 11:38 #12
Hvilken version af MySQL kører du med?
Avatar billede sark Nybegynder
14. juni 2001 - 11:43 #13
Welcome to phpMyAdmin 2.1.0
MySQL 3.22.32 running on localhost
Avatar billede delwin Nybegynder
14. juni 2001 - 12:32 #14
alvion..

hvad er det korteste ord man kan søge på den måde.. hvis jeg for eksempel søger på \"vi\" fra et felt der indeholder \"Vi kan nu stolt fremvise vores seneste produktion\" finder den det ikke.. heller ikke selvom jeg skriver \"Vi\"..

Er der en mindste grænse på længden af søgeord..?
Er det casesensitive..?
Hvad hvis det kun er en del af et ord man søger på..?
Avatar billede alvion Nybegynder
14. juni 2001 - 12:58 #15
delwin -> Der er en mindste grænse på 4 bogstaver - dvs. alle ord på tre tegn eller mindere bruges ikke. Denne grænse kan kun ændres ved at kompilere MySQL på ny.

sark -> Du skal bruge version 2.23.xx for at kunne bruge FULLTEXT indeks. Der er lige udsendt en ny version 2.23.39 - hent den.
Avatar billede delwin Nybegynder
14. juni 2001 - 12:58 #16
dang
Avatar billede alvion Nybegynder
14. juni 2001 - 12:58 #17
delwin -> den er case insensitive og kan også finde ud af danske tegn.
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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