Hov. Du er ikke logget ind.
DU SKAL VÆRE LOGGET IND, FOR AT INTERAGERE PÅ DENNE SIDE

Søgeresultat efter relevans (MySql)

Side 1 ud af 1 (5 indlæg)
  • 1
Fra Hjørring
Tilmeldt 11. Feb 06
Indlæg ialt: 712
Skrevet kl. 00:51
Hvor mange stjerner giver du? :

Jeg skal have lavet en (forbedret) søgefunktion til min shop.

Pt. kan folk søge på et eller flere ord og hvis disse ord findes i overskrift eller brødtekst, så vises den pågældende vare i søgeresultatet.

Jeg vil gerne gøre det således istedet.

1) Kunden søger på "motorhjelm"

2) Søgefunktionen skal så vise alle varer hvor motorhjelm figurer, men den skal vise alle de varer først hvor "motorhjelm" står i overskriften. Derefter skal den vise de varer hvor "motorhjelm" indgår i brødteksten

Hvordan gøres dette lettest ?

Jeg kan selvfølgelig lave 2 SQL forespørgsler men der må da være en smartere (og hurtigere) måde, hvor man kan prioritere hvad der skal vises først ?

På forhånd tak

 

StylingShop.dk - design dit eget postkasseskilt 

Tilmeldt 2. Aug 08
Indlæg ialt: 54
Skrevet kl. 22:36
Hvor mange stjerner giver du? :

Hej.

Umiddelbart er det lidt svært at svare helt konkret, når du ikke fortæller hvordan dine tabeller ser ud. Men hvis vi tager udgangspunkt i hvordan du lettest kan implementere en søgefunktion, som virker som du beskriver:

Hold det simpelt og lav 2 SQL-kald:

Kald 1: Her henter du alle varer hvis titel matcher den regular expression, som du har bygget ud fra det indtastede søgeord. 

Kald 2: Her henter du alle varer hvis brødtekst matcher samme regular expression som i kald 1.

Resultaterne fra kald 1 kan vises som de er.

Resultaterne fra kald 2 skal lige køres igennem en funktion først, hvor du tæller antal forekomster af søgeordet divideret med antallet af ord i brødteksten. Resultaterne skal så sorteres og vises, så dem med den laveste værdi står øverst (dvs. de har højest frekvens af søgeordet i forhold til størrelsen af brødteksten).

Rent cost/benefit-mæssigt set i forhold til implementeringstid/resultat, så kommer du sandsynligvis længst med ovenstående, simple løsning - fremfor at rode med at lave det hele i ét SQL-kald, hvilket afhængigt af nuværende databaseskema/mysql-version kan spænde fra en meget langhåret til en ret umulig opgave. :)

Håber du kan bruge inputtet. 

Fra Hjørring
Tilmeldt 11. Feb 06
Indlæg ialt: 712
Skrevet kl. 23:23
Hvor mange stjerner giver du? :

Hej.

Jeg kan sagtens se fornuften i det du skriver, og det lyder umiddelbart som en tilfredsstillende løsning. Jeg vil prøve at se om jeg kan få det til at virke i praksis og smider lige et indlæg her når det enten virker eller når jeg er kørt i hegnet og har flere spørgsmål :-)

Foreløbig tak for dit input

StylingShop.dk - design dit eget postkasseskilt 

Tilmeldt 22. Apr 06
Indlæg ialt: 115
Skrevet kl. 23:59
Hvor mange stjerner giver du? :

En simpel metode kunne vaere at indeksere dine data og gemme alle ord der optraeder paa en produktside i en database een gang for hver gang de optraeder paa siden. Idet du indekserer kan du saa lave nogle regler der fx.kontrollerer om ordet optraeder i en <h1>-sekvens. Hvis det er tilfaeldet, kunne du saette det ind fx. fem gange ekstra i din database.

Saa vil du ret nemt kunne lave en sortering paa hvormange gange et ord findes paa siden :)

En anden sjov metode, kunne vaere at bruge Yahoo's nye BOSS-teknik til at misbruge deres kendskab til dit site: http://developer.yahoo.com/search/boss/  :)

Tilmeldt 2. Aug 08
Indlæg ialt: 54
Skrevet kl. 01:12
Hvor mange stjerner giver du? :

Der vil du meget hurtigt få fyldt databasen op med diverse redundant data, som vil gøre det til et helvede at arbejde med :)

Idéen med indeksering er dog ganske ok og i praksis kunne man fx implementere det ved at have en ny tabel, som indeholder (keyword, vare_id, weight). 'Keyword' vil være en række relevante søgeord, som man selv finder på. 'Weight' vil være fx frekvensen af søgeordet i brødteksten for varen - eller et eller andet højt tal pga. at søgeordet optræder i overskriften for varen.

Noget konkret data i den search_index_table(keyword, vare_id, weight) tabel kunne se sådan ud:

1. 'motorhjelm', 23, 3

2. 'motorhjelm', 27, 100

3. 'motorhjelm', 32, 7

Dvs. både vare 23, 27 og 32 er relevante for søgeordet 'motorhjelm', men vare 27 er klart mest relevant.

Så SQL'en er temmelig triviel: SELECT vare_id FROM search_index_table WHERE keyword = 'search_value' ORDER BY weight DESC.

Det er jo givetvis smart, men så kommer de næste problemstillinger jo: Hvordan får man nemmest bygget denne index tabel? Det kan selvfølgelig også automatiseres, men uden at kende mere til den oprindelige problemstilling, så hælder jeg stadig mest til mit første simple forslag :) 

 

       

 

Side 1 ud af 1 (5 indlæg)