Gå til innhold

Hvordan lage et bra søkefelt?


Anbefalte innlegg

Så var det det å lage et søkefelt.

 

Etter min mening, bør det være mulig for en bruker, å skrive en bokstav feil, men samtidig få frem det man søker etter. Dersom man skal søke etter "Klovnen Kalle", er det trolig en god ting å tillate f.eks "klovnen kale" etc, slik at man tilrettelegger denne tjenesten også for de med mild dysleksi, eller de som trykler litt feil.

 

Men er dette enkelt å få til? Og vil det kreve mye av serveren å gjennomføre et søk? Dersom man velger f.eks radene id, heading, brødtekst, og innhold fra en nyhetsdatabase - og det er rundt fem tusen rader der. Skal man kjøre igjennom alle disse radene for ord som er i nærheten av f.eks "Klovnen Kalle", eller hvordan gjør man det?

 

1. Sjekke om $_POST['soek'] inneholder data.

2. Escape string (søk) tas vare på.

3. Variabel tillates å variere noe fra originalt innhold. (Gjøres om til regulært uttrykk)

4. Kobler til database.

5. Velger rader for nyhetsoverskrift, brødtekst, og innhold, som inneholder det regulære uttrykket.

6. Skriver ut disse radene i en løkke, med link til unik nyhetsid.

 

 

Har aldri laget et søk før, men er dette en god måte? Og hvordan bør det regulære uttrykket være for at dette skal fungere? Fint om noen har et bra innspill her! På forhånd takk. :)

Lenke til kommentar
Videoannonse
Annonse

Det er flere momenter som er viktige om du skal lage et ordentlig godt søkefelt, men etter å ha lest hva du skriver mener du vel egentlig et godt søk. Det finnes en rekke artikler på nettet som omhandelr dette på en god måte, men såfremt du ikke har god forståelse av PHP og MySQL (eller den databasen du benytter) kan det være smartere å gå for et system som allerede er på plass.

 

Et eksempel på søkesystem som allerede er på plass og lett å implementere er phpDig.

 

For raskt å gå gjennom feltene dine:

 

1. Sjekke om $_POST['soek'] inneholder data.

 

Dette løser du enkelt med eks. if(trim(_POST['soek'])), den vil sjekke om søket inneholder noe som helst. Utover dette bør du kanskje slenge med en lengdesjekk for ikke å søke på ord under eks. 3 bokstaver, her kan du bruke strlen().

 

2. Escape string (søk) tas vare på.

 

Her er jeg ikke med, men om du skal bruke variabelen, eller søkestrengen, direkte i en databasespørring MÅ du passe på å validere søket på forhånd, og ALLTID escape det du putter inn i spørringen. Avhengig av hva slags spørringsmotor du benytter, eller utvikler selv, kan det også tenkes at du må bryte spørringen opp å bygge en egen spørringsmotor.

 

Eks, søk som : "en frase" -bilmotor

 

Denne krever en ekstra logikk, som igjen blir helt avhengig av hvilken motor du bruker, eks. MySQL i dette tilfellet.

 

3. Variabel tillates å variere noe fra originalt innhold. (Gjøres om til regulært uttrykk)

 

Med å bruke MySQL Fulltext search får du endel på kjøpet her, da dette allerde støtter wildcard (*) og + og -. I tillegg har MySQL egne regex muligheter i spørringene sine. For øvrig kan det fordt bli litt ekstra komplisert med regulære uttrykk i spørringene, ettersom enkelte scenarier krever dobbelt escape i eks. MySQL. Altså noen finurligheter man støter på, i tillegg gjør du escapingen fordt litt komplisert også ettersom noe skal escapes og noe ikke alt etter hva de regulære uttrykket skal være.

 

4. Kobler til database.

5. Velger rader for nyhetsoverskrift, brødtekst, og innhold, som inneholder det regulære uttrykket.

6. Skriver ut disse radene i en løkke, med link til unik nyhetsid.

 

Dette har strengt tatt ikke noe med søket å gjøre, men presentasjon av resultatet du fremskaffet. Gitt at spørsmålet var å lage en søkeboks, faller dette utenom.

 

- - - -

 

Til slutt ønsker du å legge til litt fuzzy logic, eller stemming. Det letteste her er å starte med søk i Google på stemming, da dette er et stort felt og langtfra enkelt å komme igang med.

 

Alt i alt er det enkelt å definere et søk, hvordan det skal være, men det er en god grunn til at de fleste søk rundt fordi er dårlige. Dette skyldes rett og slett at funksjonalitet som stemming, anbefalte ord og fraser, søket du gav resulterte få treff, kanskje du mente dette istedenfor etc.

 

Håper du fikk noen matnyttige tips.

 

Mvh,

Kim Steinhaug

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Easy Webshop - Expired NO domains - www.easycms.no

Lenke til kommentar

Hei, og takker for et godt og utfyllende svar! :!:

 

Nå er egentlig ikke programmering (php) noe stort problem, da jeg har en del erfaring der. Og søkefelt, var vel heller ment å være "Et godt søk", som du sier. Bruker MySQL, og det var mer rekkefølgen på det som skulle skje i scriptet jeg hadde skrevet i stikkordsform.

 

Problem(ene) jeg er ute etter å løse, ligger innenfor dette:

 

* Å utføre sikre, effektive, og raske søk.

* Server / Database skal belastes kun i den grad det er nødvendig.

* Søk som ligger i nærheten av det det søkes etter, skal tas med.

* Doble søkeord tolkes både seperat, og i sammenheng. Som du sier, er det vanlig å søke både ("Kalle Klovn"), (Kalle + Klovn), (Klovnen kalle), ++.

 

Og i sistnevnte punkt er vel det du sier med MySQL fulltext search kommer inn, samt det med ekstra logikk. For som du sier, er mange søk elendige på slike områder. Aldri hørt om MySQL full text search, men rent konkret og enkelt, hvordan bruker du denne? Var så helsikes mye dokumentasjon, at jeg ble helt blind. (Ser kjapt på Google at MySQL fulltext search får endel negativ kritikk.) Har du noen erfaringer her?

 

Om man f.eks bruker det som ligger i $_POST['soek'], og:

 

* (1) Kjører (først) en spørring på streng oppdelt (explode, " "). Finner først antall ord over tre bokstaver, spør deretter $antall_ord_i_post ganger etter ord i rader.

->Returnerer rader med alle ord.

 

* (2) Kjører en spørring i disse radene på om denne strengen finnes hel i database (escaped).

-> Returnerer rader med alle ord. Sorterer disse rader til høyest verdi.

 

* (3) Kjører spørring på ord som ligner. Hvordan dette gjøres, er jeg mer usikker på, i og med at jeg er mindre dyktig med regulære uttrykk.

-> Returnerer disse. Samler i en alternativ "bunke" som kommer opp i tillegg til korrekte søk, eller under "Ingen treff, men prøv eventuelt disse".

 

* (4) Sorterer tilslutt resultat (1, 2 og 3) slik at ingen rader blir skrevet ut to ganger selvfølgelig.

 

Man er et stykke på veg med dette, eller? Men vil det være for tungvint, i et tid / ressurskrevende perspektiv?

 

Alle meldinger mottas med takk. :!:

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...