Avatar billede michaeltryl Seniormester
27. august 2011 - 00:57 Der er 13 kommentarer og
1 løsning

Finde ligende poster i mysql

på nogle sider er der følgende funktion.
an stiller et spørgsmål til support og inden spørgsmålet sende kommer en side op med spørgsmål som ligner det som er skrevet.

Jeg har fundet frem til det muligvis er full text søgning som bruges  og har forsøgt med følgende, hvor $soge_streng er det som der skal sammenlignes med.

$sql = "SELECT * FROM test WHERE MATCH (tekst) AGAINST ('+$soge_streng' IN BOOLEAN MODE)";

Der kommer dog en del resultater ud som ikke har relevans, så er der nogen som ved hvad jeg kan gøre anderledes.

Ideen er at $sogestreng indeholder en teskt på x antal ord og denne skal sammenlignes i mysql feltet tekst
Avatar billede Slettet bruger
27. august 2011 - 08:44 #1
Er du sikker på at du overhovedet HAR et problem - ikke bare har set dig blind på ét eksempel ?
- Der bør ikke retureres noget, som ikke indeholder mindst ét af ordene i søgestrengen..

Hvis der bare er for mange hits, kan du "stramme op" ved at sætte + foran de enkelte ord i strengen.
- Men det vil så betyde at ALLE ord i strengen SKAL findes. Hvilket nok er usandsynligt..

Du ku' måske nøjes med at sætte + foran det første ord, eller de 2 længste ?

NB: Det SKULLE vel ikke være "æøå-relateret" ?
Avatar billede michaeltryl Seniormester
27. august 2011 - 09:17 #2
Det er mig som har stirret mig blind på det. Den henter de rigtige poster ud, men hvis nu jeg kun vil have hentet dem ud hvor de to tekster er 60% ens.

Med similar_text("Hello World","Hello Peter",$percent); kan man sammenligne tekster procentvis, men hvordan gør jeg det med fulltext søgning

har forsøgt med
$sql = "SELECT vits, MATCH (tekst) AGAINST ('$soge_streng') AS relevance
FROM test WHERE MATCH (tekst) AGAINST ('+$soge_streng' IN BOOLEAN MODE)";
men det er nogle mærkelige relevance tal som kommer ud.
f.eks.
laver
simelar_text: 96.296296296296
mens min sql relevans giver: 31.617755889892578
Avatar billede Slettet bruger
27. august 2011 - 21:56 #3
De kan ikke sammenlignes, fulltext-søgning er ligeglad med rækkefølge, men glad for gentagelser.

Hvis du bruger 2 forskellige MODES skal fulltext-søgningen udføres 2 gange..
- det ER fristende til sorteringen (lyder ikke som en high-performance-app. ("vits"))

En anden idé:
Du kan tælle ordene i strengen på forhånd (dem > 3 tegn og ikke i stop-listen..)
- og så, hvis der er 2 eller flere ord, kræve at relevansen skal være mindst 50% af dette tal:

select vits, MATCH(tekst) AGAINST('kartofler dansker svensker tysker' IN BINARY MODE)
        where MATCH(tekst) AGAINST('kartofler dansker svensker tysker' IN BINARY MODE) >= 2
Avatar billede michaeltryl Seniormester
27. august 2011 - 23:07 #4
Er ikke lige med på hvad du mener med "stop listen"
Avatar billede Slettet bruger
28. august 2011 - 14:42 #5
Det er en bunke ord som ikke bliver indexeret fordi de er for almindelige:

Engelsk: http://dev.mysql.com/doc/refman/5.0/en/fulltext-stopwords.html
Andre sprog: www.ranks.nl/resources/stopwords.html
Avatar billede michaeltryl Seniormester
29. august 2011 - 16:00 #6
Det virker som en fornuftig løsning.
Jeg kunne dog ikke få din sql

select vits, MATCH(tekst) AGAINST('kartofler dansker svensker tysker' IN BINARY MODE) where MATCH(tekst) AGAINST('kartofler dansker svensker tysker' IN BINARY MODE) >= 2

til at virke selvom jeg huskede FROM test inden WHERE
mener du istedet

$sql = "SELECT vits, MATCH(tekst) AGAINST('$soge_streng' IN BOOLEAN MODE) FROM test
        WHERE MATCH(tekst) AGAINST('$soge_streng' IN BOOLEAN MODE) >= 2";

eller kan du se fejlen i den du postede?
Avatar billede Slettet bruger
30. august 2011 - 02:06 #7
Næh.. tror faktisk bare det var "FROM test" der manglede, sorry.

Men, medmindre du har hundreder af samtidige søgninger, så er en blanding af mit og dit første forslag (med mixed modes) nok det bedste:

SELECT vits, MATCH(tekst) AGAINST('$soge_streng') as score
FROM test
WHERE MATCH(tekst) AGAINST('$soge_streng' IN BOOLEAN MODE) >= $halvdelen
ORDER BY score DESC

Giver større sandsynlighed for at den "samme vits" kommer øverst.
- folk (stemmekvæg) ser sjældent dybere end de første 3-4 hits..

$halvdelen (50%) er dog nok i overkanten hvis der er mange ord..
Avatar billede Slettet bruger
30. august 2011 - 02:06 #8
Næh.. tror bare det var "FROM test" der manglede, sorry.

Men, medmindre du har hundreder af samtidige søgninger, så er en blanding af mit og dit første forslag (med blandede modes) nok det bedste:

SELECT vits, MATCH(tekst) AGAINST('$soge_streng') as score FROM test
WHERE MATCH(tekst) AGAINST('$soge_streng' IN BOOLEAN MODE) >= 2
ORDER BY score DESC

Giver større sandsynlighed for at de mest "nært beslægtede" vitser kommer øverst.
Avatar billede Slettet bruger
30. august 2011 - 02:07 #9
Eksperten er "sjov" omkring kl. 2..
Avatar billede michaeltryl Seniormester
31. august 2011 - 15:52 #10
Tak for din hjælp, jeg har fået det strikket sammen så det virker nu.
Lige et svar så får du point
Avatar billede Slettet bruger
31. august 2011 - 18:23 #11
S'gerne
- er det noget man kan se/prøve et sted ?
Avatar billede michaeltryl Seniormester
31. august 2011 - 18:52 #12
jeg håber at få det færdigt i aften. pt har jeg kun haft det til at køre på en simpel test side, så skal lige have det indsat rigtigt på siden.
Det bliver lagt op på
http://jokes.magiske-michael.dk
når man tilføjer jokes
Avatar billede michaeltryl Seniormester
31. august 2011 - 20:32 #13
Så blev det tilføjet til siden
Avatar billede Slettet bruger
31. august 2011 - 20:48 #14
Arh, login og email og spamtvang - nej tak.
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