FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Har WN som tidsfördriv
|
Kanske någon har en bra lösning på problemet, jag kör PHP mot en MySql db, jag har en tabell med massor av sökord, det kanske
kommer va ca 10,000 st. Jag vill sen hämta alla poster med sökord i tabellen som matchar en sökning, om ordet bilar finns i tabellen och om man söker på bil så är det ju lätt, typ "SELECT * FROM tabell WHERE keyword LIKE %bil%", problemet är att det är tvärtom, ordet bil kommer ligger i tabellen och sökningen kommer göras på bilar, då funkar det inte med "SELECT * FROM tabell WHERE keyword LIKE %bilar%" , för då plockar den inte ut keywordet bilar. Någon som har en smidig lösning som gör att man slipper plocka ut alla tusentals poster och matcha det i PHP? |
|||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Har WN som tidsfördriv
|
Menar du att om man söker på ett ord i pluralis så ska man även hitta poster där det står i singularis?
Är det bara på svenska man ska kunna söka? |
|||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Klarade millennium-buggen
|
Du får använda stemming, det är lite meckigt tyvärr.
Det du får göra är att skriva något som kollar mot kända svenska böjningar på varje sökord och sedan ändra sökfrågan "bilar" till tex where keyword like '%bil%' or keyword like '%bilar%' or keyword like '%bilen%' Jag vet tyvärr ingen bra bok om detta ämne, men det finns folk här på forumet som har erfarnheter och snart troligen ger sig på mitt svar och denna tråden. Eller så googlar du. Bästa tipset är väl att _tyvärr_ ta fram grammatikboken ifrån gymnasiet .. :-( |
||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Har WN som tidsfördriv
|
Nej det kan va andra språk än svenska också, det låter jobbigt det där med stemming, hoppas på en lättare lösning
![]() |
|||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Har WN som tidsfördriv
|
Citat:
ISBN 91-44-03178-5 Den boken är bra |
|||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Nykomling
|
Du skulle ju kunna göra en fet soundex() matchning. Soundex() i MySQL returnerar hur ett ord låter... så ord som låter likadant har samma soundexvärden.
Kod:
SELECT id, kolumn FROM tabellen WHERE *(SOUNDEX(kolumn) = SOUNDEX('sokord')) OR *LEFT(SOUNDEX(kolumn), LENGTH(SOUNDEX(kolumn)) - 1) = LEFT(SOUNDEX('sokord'), LENGTH(SOUNDEX('sokord'))- 1) OR *LEFT(SOUNDEX(kolumn), LENGTH(SOUNDEX(kolumn)) - 2) = LEFT(SOUNDEX('sokord'), LENGTH(SOUNDEX('sokord'))- 2) Då matchar sökordet "bilar" orden bilar,bilia, bilius och bil men inte orden hus, testar, testarna. Ordet "sjuk" matchar både sjuk och sjukhus men inte sjukhusen... Dessutom får du ju då inbyggd rättstavning eftersom felstavade ordet skuk matchar sjuk. :-) Blir inte direkt exakt vetenskap. Spårar säkert ur om man har 10 000 poster men du kan ju iallafall prova. ![]() Dessutom lär det dra hyffsat mycket CPU-kraft. Man kan iofs ha några hjälpkolumner där man sparar soundexvärden för keyworden så behöver man inte räkna om dem varje gång.. Fast detta är nog inte den bästa lösningen... |
||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Har WN som tidsfördriv
|
Hmm, kan funka, fast om det är ett jättelångt ord så kanske det inte är så bra?
Och sen att det drar mycket CPU låter inte bra. Kanske man ska plocka ut alla ord till en array i PHP och kolla det där, frågan är hur mycket kräm det skulle ta och hur lång tid? |
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Klarade millennium-buggen
|
Men du menar nog iaf:
SELECT * FROM tbl WHERE (SOUNDEX('keyword') = SOUNDEX(LENGTH(keyword,-1))) OR ..() Om du klipper i soundexvärdet blir det juh knas..? Fast eftersom det är som jag förstår det en fullstringsmatchning du försöker göra så kommer det juh inte att funka ändå. Isof är det juh bättre att "chansa" lite och kanske köra något i stil med: SELECT * FROM tbl WHERE keyword LIKE '%keyword%' OR keyword LIKE CONCAT('%', LENGTH('keyword',-1),'%') OR ... (Dvs man klipper ner ordet steg för steg och matchar mot hela strängen.. frågan är dock om det där funkar med concat på det sättet.. :-)) Om du har en färdig tabell så kan du ju "göra färdigt i förväg" och skapa extra fält typ som innehåller "derivationer" utav ordet som du sedan söker mot.. men jag vet inte riktigt. Då behöevr du stemming igen för att plocka fram dom.. |
||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Klarade millennium-buggen
|
Citat:
|
|||
![]() |
![]() |
![]() |
#10 | |||
|
||||
Har WN som tidsfördriv
|
En ful liten chansning som eventuellt hade kunnat fungera:
Du börjar med att mäta ordets längd, säg att ordet är längre än ett givet antal bokstäver, minst 5st, då hade man kunnat göra så att man helt sonika kapar de två sista bokstäverna och söker på de återstående 3. Ex: maskin -> mask båtmotor -> båtmot trädgård -> trädgå husdjur -> husdj Detta system skulle rensa bort alla eventuella bestämda artiklar, pluraländelser osv på ord som har dessa. På ord som inte har dessa men ändå är av en viss längd tror jag inte att de två sista bokstäverna utgör så stor betydelse. Användarna skulle förmodligen i de flesta fall få upp relevant info trots att de två sista bokstäverna är bortkapade. En nödlösning som säkert fungerar hyffsat bra utan större besvär och utan att ta större CPU-kraft. EDIT: stavfel |
|||
![]() |
![]() |
Svara |
|
|