Kom ihåg mig?
Home Menu

Menu


Reverserad matchning

Ämnesverktyg Visningsalternativ
Oläst 2004-09-20, 13:48 #1
ZNs avatar
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2003
Inlägg: 1 214
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
ZNs avatar
 
Reg.datum: Apr 2003
Inlägg: 1 214
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?
ZN är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-20, 13:56 #2
Lundmarks avatar
Lundmark Lundmark är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 026
Lundmark Lundmark är inte uppkopplad
Har WN som tidsfördriv
Lundmarks avatar
 
Reg.datum: Jan 2004
Inlägg: 1 026
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?
Lundmark är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-20, 14:14 #3
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
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 .. :-(
grazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-20, 15:02 #4
ZNs avatar
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2003
Inlägg: 1 214
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
ZNs avatar
 
Reg.datum: Apr 2003
Inlägg: 1 214
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
ZN är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-20, 15:20 #5
Lundmarks avatar
Lundmark Lundmark är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 026
Lundmark Lundmark är inte uppkopplad
Har WN som tidsfördriv
Lundmarks avatar
 
Reg.datum: Jan 2004
Inlägg: 1 026
Citat:
Jag vet tyvärr ingen bra bok om detta ämne
Informationssökning på internet

ISBN 91-44-03178-5

Den boken är bra
Lundmark är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-21, 19:50 #6
knafve knafve är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2003
Inlägg: 42
knafve knafve är inte uppkopplad
Nykomling
 
Reg.datum: Oct 2003
Inlägg: 42
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)
Det den gör är att den försöker först matcha ord som låter exakt som sökordet. Sedan försöker den matcha ord som börjar på samma sätt fast som avslutas på olika sätt.

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...
knafve är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-21, 21:23 #7
ZNs avatar
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Apr 2003
Inlägg: 1 214
ZN ZN är inte uppkopplad
Har WN som tidsfördriv
ZNs avatar
 
Reg.datum: Apr 2003
Inlägg: 1 214
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?
ZN är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-22, 08:18 #8
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
grazzy grazzy är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Mar 2004
Inlägg: 3 471
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..
grazzy är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-22, 11:00 #9
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Citat:
Originally posted by grazzy@Sep 22 2004, 08:18
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..
Ja, men stemmingen görs då 1 gång istället för xxx så prestanda sparas (men db storlek ökas)
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2004-09-22, 16:43 #10
Kristofers avatar
Kristofer Kristofer är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Mar 2004
Inlägg: 1 053
Kristofer Kristofer är inte uppkopplad
Har WN som tidsfördriv
Kristofers avatar
 
Reg.datum: Mar 2004
Inlägg: 1 053
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
Kristofer är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 21:29.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017