Tjenare! Har skrivit en sökmotor tidigare. Det finns ett par olika metoder, men jag har inte tid att gå igenom dem nu. Jag återkommer lite senare. Har du postat inlägg inom detta område tidigare är jag tacksam för länkar. Ah, tur att du svarade, jag hade glömt helt... =) Kom på att det finns två andra saker att ta hänsyn till. Sökfunktion på befintlig webb
Jag har aldrig byggt någon sökfunktion för någon sakt tidigare. Alltså en sökfunktion som enbart söker på innehåll på den egna sajten. Någon som har några tankar och förslag innan jag gräver mig ned i koden?
Min initiala tanke är att lägga upp en tabell med sökord som matchar en viss aspx. Det borde ju vara sättet att gå, eller vad säger forumets medlemmar??
Den webb jag ämnar implementera detta på nyttjar dynamisk språkhantering (UICulture) så för varje nytt språk som läggs upp måste ju även tabellen med sökord utökas.
Tacksam för all info jag kan få.
// NickeSv: Sökfunktion på befintlig webb
In the meantime kan du kolla på VSP, det är en helt ok metod.Sv:Sökfunktion på befintlig webb
Ha de fint!!
// NickeSv: Sökfunktion på befintlig webb
Har väl inte postat jättemycket om det, däremot gjort i verkligheten, men kan snabbt beskriva alternativen här:
Det finns i princip två stora klasser av sökmotorer:
1. Ordbaserat
2. Ämnesbaserat
Ämnesbaserade är såna som yahoo var (och är?), och google har väl något sånt i viss mån, etc. Då finns det för varje sida ett antal ämnen, och sen letar sökmotorn upp de vettigaste sidorna givet att man själv anger ämnen.
I verkliga Internet funkar detta förstås inte jättebra; folk fuskar med meta-information, och utgår man inte från den måste folk manuellt kontrollera alla webbplatser.
Det kan däremot funka på en intern webbplats. Se till att varje person som gör en sida fyller i de keywords och ämnen som kan vara relevanta, på något lämpligt sätt (in i en databas via ett CMS, i meta-taggar, etc.).
Ordbaserade fungerar istället genom att man tittar på de enskilda orden på en sida. Det enklaste är att registrera alla ord, och ange 1 eller 0 beroende på om de finns. Lite jobbigare, men mycket bättre, är att istället ange hur många av varje ord som finns. Det finns mer komplicerade scheman, hur nära ord står varandra, och liknande.
Oavsett om man kör med ordbaserade eller ämnesbaserade så får man nu göra upp t.ex. en databas enligt:
Words(id, text)
-----
1 apa
2 banan
...
Pages(id, url)
-----
1 a.html
2 b.html
...
Occurences(page, word, count)
1 1 10
1 2 5
2 2 3
...
Vilket då säger att a.html innehåller ordet "apa" 10 gånger, och ordet "banan" 5 gånger, medan b.html innehåller ordet "banan" 3 gånger, men inte "apa" alls. ("ordet" kan naturligtvis då också vara ämnet)
Detta får man göra vid regelbundna intervall, eller så fort någon lägger in en ny sida.
Nu finns det två saker kvar innan det blir en sökmotor; selection och ranking. Det enklaste är Boolean search utan ranking.
Då gör man helt enkelt så att om någon skriver in ordet "apa" i sökmotorn så söker man fram ID=1, och använder det för att leta upp alla Occurences där WordID = 1. Alla matchande PageID visar man upp. Utöver detta kan man kombinera med andra ord och dessutom lägga till saker som "AND", "OR" och "NOT" för att välja ut rätt sidor (detta genom att göra mängdoperationer på resulterande tabeller).
Om man vill ha ranking - och det vill man - så kan man lägga till en popularitet. Användare kan till exempel rösta på sidor för att lägga vissa sidor högst upp, eller så kan man konstruera något motsvarande PageRank.
Hur som helst: jag tycker inte du ska använda metoden ovan, den är ganska omständig att få vettiga resultat ifrån, det kräver mycket röstning etc. Vad jag tycker att du ska göra istället är den så kallade Vector space model, VSM.
Principen är rätt enkel: tänk dig att vi bara har två ord, "apa" och "banan".
Vi bestämmer nu att nu "apa" är på x-axeln, och "banan" är på y-axeln. Detta ger ett rutnät. Varje sida kan nu sättas in i det här rutnätet. Den första sidan ("a.html") kommer ligga på punkten (10, 5), och den andra ("b.html") på (0,3).
Nu tar vi först och gör så att avståndet till (0,0) är 1, vi delar med avståndet. Den första hamnar då på (2/sqrt(5), 1/sqrt(5)) = (0.89, 0.45) och den andra på (0,1). Är du fortfarande med?
En sökning är nu en rad ord, man kan till exempel ange apa 4 gånger och banan 3. Det vanliga är att man bara anger varje ord en gång, förstås. Detta ger ytterligare en punkt i rutnätet, den här gången i punkten (4/5, 3/5) = (0.8, 0.6). Det enda som är kvar nu är att kolla vilken av sidorna som är närmast.
Det kanske låter komplicerat, men det är det inte. I praktiken gör man bara så här:
1. Du får en rad ord som söksträng, kolla upp dem i Words-tabellen.
2. För varje ord X i söksträngen (med n förekomster, n brukar vara 1):
2.1. Nu hämtar du ut allt ur Occurences som innehåller ordet X.
2.2. Multiplicera Count:en med n, kalla detta y.
3. Nu summerar du y för varje sida, typ "SELECT PageID, SUM(y) FROM ... GROUP BY PageID"
4. Det sista du gör är att dividera varje sånt tal med antalet ord i kvadrat för resp. sida. Kalla detta z.
5. Sortera på z. Den som har högst värde ligger närmast sökningen.
För att ta exemplet ovan (men vi lägger till ett nytt ord citron):
sida A: 10 apa, 5 banan, 0 citron
sida B: 0 apa, 3 banan, 3 citron
söksträng: 4 apa, 3 banan.
Vi börjar med sida A:
apa: 10 (från sidan) * 4 (från söksträngen) = 40
banan: 5 (sidan) * 3 (sökning) = 15
citron: 0 * 0 = 0
y = 40 + 15 + 0 = 55
"Längden" på sidan: sqrt(apa^2 + banan^2 + citron^2) = sqrt(10*10 + 5*5 + 0*0) = sqrt(125)
z = 55/sqrt(125) = 4.9
Sida B:
apa: 0 (sidan) *4 (sökning) = 0
banan: 3 (sidan) * 3(sökning) = 9
citron: 3 (sidan) * 0(sökning) = 0
y = 9
"längden" på sidan = sqrt( 0*0 + 3*3 + 3*3) = sqrt(18)
z = 9/sqrt(18) = 2.1
That's it. Förstår att det blir lite virrigt med så mycket text. Men jag kan nästan garantera dig: Använder du något för enkelt blir resultaten inte bra ändå. Den här sistnämnda är den viktigaste och mest hållbara.Sv: Sökfunktion på befintlig webb
För det första så ska man som ett första steg i VSM-metoden ta bort alla ord som finns i mer än x% av sidorna, oftast 50%. De är för vanliga (typ "och"), och tjänar inget till att ha med i sökningen. Det första man gör är därför att filtrera bort alla de orden, och sen kör.
För det andra är det ganska enkelt att införa röstning i VSM också, ifall man känner att det behövs. Principen är helt enkelt att man på något sätt får input om att "den här sidan passade inte så bra in på den här sökningen".
Om vi tar första exemplet, vad man gör då är att om sökningen till exempel innehåller 4 "apa" och 3 "banan", och sidan som tidigare har 10 "apa" och 5 "banan", så väljer man en liten faktor a, kanske 0.01 eller 0.1 (detta avgör hur snabbt rankingen ändras).
Sen multiplicerar man varje tal i sökningen med a, och drar ifrån detta från sidan. om vi tar a = 0.1 får vi då
0.4 "apa" och 0.3 "banan", vi drar bort det från sidan och får
10 - 0.4 = 9.6 "apa"
5 - 0.3 = 4.7 "banan"
Jag tror att det räcker att sätta talet till 0 om det blir mindre än 0.