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?
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.
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 =)
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...
Synes godt om
Ny brugerNybegynder
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.