Avatar billede Slettet bruger
14. august 2006 - 20:22 Der er 6 kommentarer og
1 løsning

Fritekstsøgning - hvordan er procedure?

Hej eksperter.

Jeg arbejder på en søgefunktionalitet, hvor der skal søges på en stribe søgeord i PHP.

Jeg har p.t. følgende query, der skal udbygges:

SELECT element_id FROM element WHERE soegeord LIKE '".$wildcard.$soegeord.$wildcard."'

"$wildcard" sendes med søgningen og kan være enten "" eller "%", således at der f.eks. kan returneres en bil, såfremt der søges på "automobiler"

MEN: Min database rummer en tupel med FLERE søgeord, f.eks.:
"dans danser mavedans pige eksotisk"

1) Tuplen skal returneres, hvis mindst én overensstemmelse forekommer
2) Man skal kunne søge i ikke-lineær rækkefølge, f.eks. eksotisk mavedans
3) En nice2have kunne være sortering efter forekomst, dvs. at tuplerne sorteres efter hvor mange søgeord der stemte overens - men er ikke en højprioritet lige nu.

Kan dette ordnes umiddelbart vha. en SQL-query - eller skal der mere til (f.eks. noget PHP, der splitter ordene op og sætter en masse LIKE's op...)?

Kan nogen hjælpe; jeg er lidt lost...
Avatar billede arne_v Ekspert
15. august 2006 - 00:42 #1
har du læst http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html og
vurderet om det var noget du kunne bruge ?
Avatar billede Slettet bruger
16. august 2006 - 23:52 #2
Hej Arne og tak for info.

Jeg har pløjet teksten og en stribe eksempler fra andre sites igennem - og det viser gode takter.

Her er et eksempel på et kald, jeg laver:

SELECT element_id
FROM element
WHERE MATCH ( soegeord )
AGAINST ('danser' IN BOOLEAN MODE);

Den returnerer 3 poster. Så vidt, så godt.
Søgeordene i de 3 poster er hhv.:
- mave eksotisk danser
- danser eksotisk
- danser

Problemet er nu blot at samme 3 poster returneres, hvis jeg f.eks. søger på MATCH ('danser eksotisk') - så tilsyneladende ignorerer den ord nr. 2.

I dit fremsendte link står dog et stykke nede noget, der virker brugbart:
"The following example is more complex. The query returns the relevance values and it also sorts the rows in order of decreasing relevance". Lyder lovende!
Men er det noget i denne retning, skribenten mener - oversat til min problematik?

SELECT element_id
MATCH ( soegeord )
AGAINST (  'dans' )
FROM element
WHERE  MATCH ( soegeord )
AGAINST (  'eksotisk' )

Kaldet herover virker dog ikke - men hensigten: At loope og konkatenere en "MATCH AGAINST" jf. antallet af søgeord, kan det være den rigtige vej at gå?

Og lige en ting mere: man skal kunne anvende søgeord "danser eksotisk" på linie med "eksotisk danser"
Avatar billede Slettet bruger
16. august 2006 - 23:53 #3
glemte lige: Hvad betyder "IN BOOLEAN MODE"? Den er ihvertfald afgørende for, hvorvidt query'en eksekveres korrekt eller ej...
Avatar billede arne_v Ekspert
17. august 2006 - 03:00 #4
prøv:

AGAINST ('+danser +eksotisk' IN BOOLEAN MODE);

IN BOOLEAN MODE betyder at ord med + skal være der

se http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html
Avatar billede arne_v Ekspert
17. august 2006 - 03:01 #5
og rækkefølgen er så vidt jeg kan se ligegyldig
Avatar billede Slettet bruger
18. august 2006 - 19:17 #6
Jamen det spiller jo bare. Tak :-)

(Bare svar, så får du point).
Avatar billede arne_v Ekspert
18. august 2006 - 19:38 #7
kommer her
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
Computerworld tilbyder specialiserede kurser i database-management

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