webForumDet fria alternativet

containstable/freetexttable

11 svar · 318 visningar · startad av doggelito

doggelitoMedlem sedan juni 20003 076 inlägg
#1

går det att använda containstable eller freetexttable till att söka på delar av ord?
som jag fattat det så går det inte!
ex.
ett fält innehåller 'jonnys byggfirma'
då vill jag kunna söka på 'firma'
men av detta får jag ej något resultat, ska det vara så?

om inte ovan går att söka på delar av ord, hur kan man då bygga en egen "sökmotor" i sqlservern utan att behöva använda sig av en massa LIKE-satser?

BrimbaMedlem sedan dec. 19995 875 inlägg
#2

Fulltextindexeringen är ordbaserad. Den klarar inte av wildcards.
Du kan däremot gå andra vägen, exempelvis om du vill söka på 'jonnys byggfirma', så skulle det innebära att du söker efter poster som innehåller 'jonnys' eller 'byggfirma'. Om du däremot söker efter '"jonnys byggfirma"', så har du kommit runt problemet.

Jag vet inget bra sätt för att lösa ditt problem. Möjligen är like-metoden den bästa.

doggelitoMedlem sedan juni 20003 076 inlägg
#3

ok :(
men om man skulle ge sig på att bygga något eget, var bör man börja?
är det någon idé alls att försöka göra en egen sökmotor eller kan man lika gärna köra med förtielva like-satser?
går det överhuvudtaget att bygga en egen sökmotor i sql-servern?
hur funkar webbforums sökfunktion egentligen?
(webforum kör ju mySql, men jag kan inte tänka mig att det skulle finnas några inbyggda funktioner där som hanterar sökningar som inte sql-server har.)

många frågor blir det! :)

emissionMedlem sedan dec. 19996 721 inlägg
#4

Fulltextindexeringen klarar delvis av wildcards, men endast i slutet av ord, så det löser inte ditt "firma"-problem.

webForums sökfunktion splittar upp alla inlägg i enskilda ord och lagrar dem i en tabell med ord, samt en tabell som agerar nyckel mellan ord och inlägg. Ett fulltextindex, med andra ord.

doggelitoMedlem sedan juni 20003 076 inlägg
#5

man skulle med andra ord kunna bygga en egen sökmotorsfunktion! :)
hmm, vad är det egentligen som händer i bakgrunden vid en sökning på webforum:
1. en besökare skriver ett/flera ord i ett formulär.
2. formuläret postas mot databasen.
3. orden splittas upp och insertas i en tabell.
jag antar att en koll görs här om ordet redan finns i tabellen, då görs ingen insert eller?
4. ja, vad händer sen? hur skapas relationerna mellan ord och inlägg?
och om ett nytt inlägg skapas som innehåller ett ord som redan finns i ordtabellen, hur uppdateras relationstabellen då?
sköts det via schemaläggning, precis som fulltextindexeringen fungerar eller? eller sker det i realtid?

emissionMedlem sedan dec. 19996 721 inlägg
#6

doggelito skrev:

1. en besökare skriver ett/flera ord i ett formulär.
2. formuläret postas mot databasen.
3. orden splittas upp och insertas i en tabell.
jag antar att en koll görs här om ordet redan finns i tabellen, då görs ingen insert eller?

Det stämmer bra

doggelito skrev:

4. ja, vad händer sen? hur skapas relationerna mellan ord och inlägg?
och om ett nytt inlägg skapas som innehåller ett ord som redan finns i ordtabellen, hur uppdateras relationstabellen då?

Tabellen innehåller ordets id-nummer, inläggets id-nummer samt en kolumn som anger hur många gånger ordet förekom i inlägget. Inget hokus pokus.

doggelito skrev:

sköts det via schemaläggning, precis som fulltextindexeringen fungerar eller? eller sker det i realtid?

I äldre versioner av forumet har det körs med schemaläggning (tror jag), men nu uppdateras indexet direkt.

Främsta tanken med ed sådant index är inte att göra sökningarna kraftfullare, för det blir de inte. Däremot blir de väldigt mycket snabbare, eftersom det är mycket enklare (före DBMS:en) att leta efter exakta ord i en liten kolumn än att leta med LIKE i en jättekolumn.

doggelitoMedlem sedan juni 20003 076 inlägg
#7

Hmm, intressant detta!

emission skrev:

eftersom det är mycket enklare (före DBMS:en) att leta efter exakta ord

Så sant, så sant! :)
Men blir det inte jobbigt för databasen ändå? Jag tänker på vid en sökning:
1. Ordet skickas in i ordtabellen.
2. Och sen, för att få relationerna så måste väl en like köras mot inläggstabellen för att plocka ut alla id:n, eller?
Men det kanske inte blir så tungt?!
Och om en användare sedan ändrar i sitt inlägg så lär väl nån typ likesats köras igen för att kolla om sökordet fortfarande finns med i texten.
Hajjar inte detta riktigt!?

hopparnMedlem sedan nov. 20011 551 inlägg
#8

vi har byggt en sökmotor för vår webplats mha fulltextindex och den funkar hyfsat, dock är det tråkigt att wildcards bara fungerar i slutet precis som nämnts ovan. Vi har dessutom fått skapa en egen sk noise fil då vi måste kunna söka med vad som i vanliga fall kallas skräptecken :)

emissionMedlem sedan dec. 19996 721 inlägg
#9

doggelito skrev:

Hmm, intressant detta!

emission skrev:

eftersom det är mycket enklare (före DBMS:en) att leta efter exakta ord

Så sant, så sant! :)
Men blir det inte jobbigt för databasen ändå? Jag tänker på vid en sökning:
1. Ordet skickas in i ordtabellen.
2. Och sen, för att få relationerna så måste väl en like köras mot inläggstabellen för att plocka ut alla id:n, eller?
Men det kanske inte blir så tungt?!
Och om en användare sedan ändrar i sitt inlägg så lär väl nån typ likesats köras igen för att kolla om sökordet fortfarande finns med i texten.
Hajjar inte detta riktigt!?

Nej, så funkar det inte. Funktionen är precis som fulltextindexering.

  1. En användare postar ett inlägg
  2. Inlägget splittas upp i ord
  3. en ny array skapas av orden, där varje element innhåller ordet samt antalet gånger det förkom i ursprungstexten
  4. Man loopar igenom arrayen
  5. För varje ord kontrolleras om det redan finns i "ordlistan". Finns det så hämtar man dess id-nummer. Finns det inte så lägger man till det, och får det nya id-numret
  6. För varje ord läggs också en rad i nyckeltabellen, innehållande endast inläggs-id, ord-id och ordförekomst (antalet gånger ordet förekom)
  7. Klart!

eller

  1. En användare redigerar ett inlägg
  2. Alla rader i nyckeltabellen, som rör detta inlägg, raderas
  3. Punkt 2-7 från förra exemplet
  4. Vid tillfälle kan man radera alla ord ur ordlistan som inte har något koppling i nyckeltabellen

och vid sökning

  1. En användare söker efter något
  2. Sökningsfrasen delas upp i ord
  3. Dessa ords id-nummer söks upp i ordlistan. Om antalet returnerade rader är mindre än antalet ord så innebär det att inget kommer att matcha på alla orden. Huruvida man bryr sig om det eller inte är valfritt. Minst en rad bör man få i alla fall, annars kan man stanna här
  4. En ny SQL-sats byggs upp som joinar ihop inläggen med nyckeltabellen, en gång per returnerad id-rad
  5. Klart!

Punkt 3 och 4 kan slås ihop till en enda SQL-sats, men det blir sannolikt mindre effektivt.

LIKE används aldrig

doggelitoMedlem sedan juni 20003 076 inlägg
#10

Aha, då blev jag en hel del klokare! :bire

En liten slutfundering bara:
1. Antalet gånger ett ord finns med i inlägget (ordförekomsten), är detta till för att kunna göra en ranking av sökresultatet om man skulle vilja?
2. LIKE används inte alls säger du, hmm, man kan alltså inte använda wildcards då på webforum, det har jag faktiskt inte tänkt på!?

emissionMedlem sedan dec. 19996 721 inlägg
#11

doggelito skrev:

Aha, då blev jag en hel del klokare! :bire

En liten slutfundering bara:
1. Antalet gånger ett ord finns med i inlägget (ordförekomsten), är detta till för att kunna göra en ranking av sökresultatet om man skulle vilja?

Jajamen!

doggelito skrev:

2. LIKE används inte alls säger du, hmm, man kan alltså inte använda wildcards då på webforum, det har jag faktiskt inte tänkt på!?

Jo, det kan man. Jag skrev det mest som ett genmäle på det du skrev i inlägget ovan. Det fins inget som hindrar att man använder LIKE för att plocka ut sökordskandidater i punkt 3 ovan, vilket är precis vad som görs på wF.

doggelitoMedlem sedan juni 20003 076 inlägg
#12

Okidoki, då är det glasklart! :)

Riktigt feta tack, emission för att du tog dig tid att skriva så utförliga och tydliga svar! :bire

131 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)