Avatar billede dj-sejler Praktikant
14. august 2012 - 23:21 Der er 4 kommentarer

søgning som søgemaskine

Jeg har har en masse brugere med profiltekster, som alle er gemt i MySQL databaser.

Jeg vil rigtig meget gerne kunne søge i disse profil ved at man skriver en række relevante ord (som på Google) og så finder man den med højest relevans (fleste ord) øverst...

Det skal siges at jeg benytter mig af JOIN i MySQL

Men lade os antage databasen ser ud som følger:

:: TABLE ::
id
user_id
metakey
metavalue

hvor metakey skal være lig med profil: table.metakey = 'profil'
men hvad skal jeg så gøre for at søge på de forskellige ord eller dele af søge strengen?
Avatar billede olebole Juniormester
15. august 2012 - 01:05 #1
<ole>

Det korte svar lyder: Det gør du ikke.

Det længere lyder: Du læser en masse om bigrammer, trigrammer og søgealgoritmer - evt. suppleret med et par moduler på ITU.

'Relevans' er ikke bare bestemt udfra antallet af ord, men i ligeså høj grad af deres relationer (bl.a. hvor tæt på hinanden de står), samt en 'truck-load' af andre 'detaljer'.

Du skal også rense søgeforespørgslen for 'ligegyldige' ord. F.eks. hvis brugeren søger med en sætning, som indeholder ord som 'i', 'og', 'at', 'der', 'den', 'det' og masser af andre. Ellers sender du din database på et gigantisk overarbejde, da de må forventes at stå (måske endda mange gange) i enhver post. I forvejen er den slags søgninger ofte meget tunge, da de bygger på 'LIKE' og wildcards.

Hører du ydermere til dem, der gemmer data, rodet sammen med HTML, i databasen, er der sat vand over til alvorlige udfordringer. Er det tilfældet - og du ikke kan undgå det i den aktuelle applikation - kan det blive nødvendigt at replikere al indhold til en parallel DB, uden HTML ... og søge i dén.

Det er ikke ukompliceret at lave en god søgemekanisme - spørg Eksperten! God og effektiv søgesoftware er en af de marker, milliarderne gror triveligt på  *o)

Det realistiske svar lyder derfor: Forsøg at holde dine søgninger så simple som mulige - og helst kun på et ord eller to. Når du så efterhånden får luget ud i de værste ressourcedræbere og får bedre styr på forskellige søgetilgange og deres fordele/ulemper, kan du gøre søgningerne mere komplekse.

/mvh
</bole>
Avatar billede dj-sejler Praktikant
15. august 2012 - 08:31 #2
jeg gemmer ikke html i db'en
jeg antager at mine besøgende kun benytter nøgleord i deres søgning (det skriver jeg til dem de skal ;) )

Jeg har prøvet med LIKE i sql'en men det virker kun for enkelt ord - så har jeg "explode"et bruge OR mellem LIKE's

Jeg har prøvet MATCH AGAINST men kan ikke få det til virke

Hvis jeg søger på "Kommunikation" får jeg resultater, men søger jeg på "Kom" gør jeg ikke...

Så jeg vil holde det helt simpelt, men med mulighed for flere nøgleord end et.
Avatar billede olebole Juniormester
15. august 2012 - 14:48 #3
LIKE sammen med OR fungerer, så hvis det ikke gør det hos dig (hvad du indikerer uden at være særlig klar i mælet), må du gøre noget forkert. Da du ikke oplyser, hvad det er, du gør, er det svært at give råd om bedre fremgangsmåder.

"Hvis jeg søger på "Kommunikation" får jeg resultater, men søger jeg på "Kom" gør jeg ikke..." >> Det lyder jo som en fin begyndelse. Så har dine brugere da ikke den slags ubrugelige resultater at slås med. "Kom" er jo bare ét af de ord, "Kommunikation" i så fald skulle forslå som resultat. Derudover er der ord som "ni", "ti", "ion", "om", "uni", "kation" - og muligvis flere. Præcis den virkemåde, der kendetegner en elendig, brugeruvenlig søgefunktion  *o)

LIKE søgninger er som sagt meget langsomme - og hamrende langsomme i kombination med wildcards. Sætter du to sammen med OR, bliver resultatet 'langsomt i anden'. Sætter du tre sammen, bliver resultatet 'langsomt i tredie' - og så fremdeles. Du multiplicerer de implicerede 'delforespørgslers' langsommelighed med hinanden.

Det lyder alt i alt, som om du bør holde en tænkepause og overveje, hvad det faktisk er, du ønsker  =)
Avatar billede dj-sejler Praktikant
15. august 2012 - 22:40 #4
Hmm...

Jeg ønsker at en besøgende udefra skal kunne finde fornuftige kandidater ved at skrive nogle nøgleord.

Alle de nødvendige data ligger i 6 rækker for hver bruger, hvor de fem rækker højst er 150 tegn

Derudover forudsætter jeg 3 rækker skal have værdien '1' for at være aktiv

SELECT user_id, MATCH (t1.meta_value) AGAINST('*".$s."*' IN BOOLEAN MODE) AS Relavance FROM t1 JOIN t2 ON t1.user_id = t2.id WHERE MATCH (t1.meta_value) AGAINST('*".$s."*' IN BOOLEAN MODE) AND t1.meta_key = 'user_describtion' AND t2.user_activated = 1 AND t2.user_anonymous = 0 AND t2.user_show = 1 AND t2.user_active = 1 ORDER BY Relavance, t2.user_lastlogin desc LIMIT 10

Hvis jeg her skriver "SEO Kommunikation" kommer der 10 frem, søger jeg på "SEO" kommer der intet til trods for at den første indeholdt SEO...
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

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