full text search en stuk van een string
Hallo allemaal,
Ik heb een lijst met gegevens waar ik in wil zoeken met een LIKE of een match against (of beide)
Mijn probleem:
Als ik het woord 'kratje' wil zoeken moet er ook een match zijn met bierkratje.
source:
SELECT * FROM `woordenlijst` WHERE (match(title) against('kratje'))
Ik krijg nou dus wel een match met met kratje maar niet met bierkratje, als ik against('+Kratje*' In boolean mode) gebruik krijg ik wel kratjebier maar,
against('+*Kratje' In boolean mode) of
against('+*Kratje*' In boolean mode) werkt en mag niet?
Nu kan ik een like gebruiken maar deze geeft niet altijd het beste resultaat.
Mijn vraag, kun je met een match against een zoekwoord vinden in een groter woord?
Sorry als beetje vaag is maar ik wil dit niet in php doen omdat er te veel resultaten zijn en ik dan 100 keer 200.000 records moet zoeken.
Alvast bedankt.
Ik heb een lijst met gegevens waar ik in wil zoeken met een LIKE of een match against (of beide)
Mijn probleem:
Als ik het woord 'kratje' wil zoeken moet er ook een match zijn met bierkratje.
source:
SELECT * FROM `woordenlijst` WHERE (match(title) against('kratje'))
Ik krijg nou dus wel een match met met kratje maar niet met bierkratje, als ik against('+Kratje*' In boolean mode) gebruik krijg ik wel kratjebier maar,
against('+*Kratje' In boolean mode) of
against('+*Kratje*' In boolean mode) werkt en mag niet?
Nu kan ik een like gebruiken maar deze geeft niet altijd het beste resultaat.
Mijn vraag, kun je met een match against een zoekwoord vinden in een groter woord?
Sorry als beetje vaag is maar ik wil dit niet in php doen omdat er te veel resultaten zijn en ik dan 100 keer 200.000 records moet zoeken.
Alvast bedankt.
De eerste query zou eigenlijk gewoon raak moeten zijn. Zowel 'bierkratje' als 'kratjebier' worden gevonden bij 'kratje':
SELECT * FROM woordenlijst WHERE (MATCH(title) AGAINST ('kratje'))
Hoe ziet de FULLTEXT INDEX eruit die je op de tabel hebt gezet? In een MATCH() moet je in principe alle kolommen uit de full-text index noemen. Dus niet alleen MATCH(title) als de index zich over meerdere kolommen uitstrekt.
SELECT * FROM woordenlijst WHERE (MATCH(title) AGAINST ('kratje'))
Hoe ziet de FULLTEXT INDEX eruit die je op de tabel hebt gezet? In een MATCH() moet je in principe alle kolommen uit de full-text index noemen. Dus niet alleen MATCH(title) als de index zich over meerdere kolommen uitstrekt.
Het gaat echt om een kolom die fulltext is.
Nog een voorbeeld:
ik heb 'Kipschnitzels' en 'schnitz' maar een query als:
SELECT * FROM `cat_plist` WHERE (MATCH(`positief`) AGAINST ('schnitz'))
levert alleen 'schnitz' op.
Ook met score:
SELECT *,
MATCH(`positief`) AGAINST ('schnitz') AS SCORE
FROM `cat_plist`
WHERE MATCH(`positief`) AGAINST ('schnitz')
Nog een voorbeeld:
ik heb 'Kipschnitzels' en 'schnitz' maar een query als:
SELECT * FROM `cat_plist` WHERE (MATCH(`positief`) AGAINST ('schnitz'))
levert alleen 'schnitz' op.
Ook met score:
SELECT *,
MATCH(`positief`) AGAINST ('schnitz') AS SCORE
FROM `cat_plist`
WHERE MATCH(`positief`) AGAINST ('schnitz')
Laat eens een CREATE TABLE tabeldefinitie zien met de indexen?
Server info:
Server version: 5.1.41-3ubuntu12.10
Protocol version: 10
CREATE TABLE IF NOT EXISTS `cat_plist` (
`Id` int(255) NOT NULL AUTO_INCREMENT,
`positief` text,
`category1` varchar(255) NOT NULL DEFAULT '',
`category1` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`posId`),
FULLTEXT KEY `positief` (`positief`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=23287 ;
Server version: 5.1.41-3ubuntu12.10
Protocol version: 10
CREATE TABLE IF NOT EXISTS `cat_plist` (
`Id` int(255) NOT NULL AUTO_INCREMENT,
`positief` text,
`category1` varchar(255) NOT NULL DEFAULT '',
`category1` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`posId`),
FULLTEXT KEY `positief` (`positief`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=23287 ;
En laat nu eens de echte tabel zien? Deze bevat namelijk al twee fouten:
#1060 - Duplicate column name 'category1'
#1072 - Key column 'posId' doesn't exist in table
#1060 - Duplicate column name 'category1'
#1072 - Key column 'posId' doesn't exist in table
Ik ben ook bezig met testen, sorry.
CREATE TABLE IF NOT EXISTS `cat_plist` (
`Id` int(255) NOT NULL AUTO_INCREMENT,
`positief` text,
`category1` varchar(255) NOT NULL DEFAULT '',
`category2` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`Id`),
FULLTEXT KEY `positief` (`positief`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=23287 ;
Deze moet prima doen.
CREATE TABLE IF NOT EXISTS `cat_plist` (
`Id` int(255) NOT NULL AUTO_INCREMENT,
`positief` text,
`category1` varchar(255) NOT NULL DEFAULT '',
`category2` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`Id`),
FULLTEXT KEY `positief` (`positief`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=23287 ;
Deze moet prima doen.
Als je nog aan het testen bent, houd dan rekening met de beperkingen van de testdata. MySQL gaat ervan uit dat een zoekwoord niet relevant is als het te vaak voorkomt. Als je zoekwoord 'kratje' is terug te vinden in meer dan de helft van de rijen, levert een full-test search niets op.
Probeer het dus eens met meer gevarieerde teksten, want je query zonder jokertekens is op zich goed.
Probeer het dus eens met meer gevarieerde teksten, want je query zonder jokertekens is op zich goed.
Ja dat weet ik, heb 40 rows erin staan en 2 met waar ik op zoek.
Ik twijfel eraan of match against dit wel kan, je kan namelijk met boolean mode een wildcard gebruiken * maar deze mkan denk ik niet 2 keer. Iemand nog een idee wat er fout is? of een beter idee?
groet karel
Ik twijfel eraan of match against dit wel kan, je kan namelijk met boolean mode een wildcard gebruiken * maar deze mkan denk ik niet 2 keer. Iemand nog een idee wat er fout is? of een beter idee?
groet karel




