full text search en stuk van een string

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Karel hertens

karel hertens

03/10/2011 13:56:31
Quote Anchor link
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.
 
PHP hulp

PHP hulp

27/04/2024 01:00:29
 
Ward van der Put
Moderator

Ward van der Put

03/10/2011 14:28:54
Quote Anchor link
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.
 
Karel hertens

karel hertens

03/10/2011 14:58:01
Quote Anchor link
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')
 
Ward van der Put
Moderator

Ward van der Put

03/10/2011 15:27:23
Quote Anchor link
Laat eens een CREATE TABLE tabeldefinitie zien met de indexen?
 
Karel hertens

karel hertens

03/10/2011 16:46:17
Quote Anchor link
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 ;
 
Ward van der Put
Moderator

Ward van der Put

03/10/2011 16:56:39
Quote Anchor link
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
 
Karel hertens

karel hertens

03/10/2011 16:59:10
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

03/10/2011 19:55:37
Quote Anchor link
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.
 
Karel hertens

karel hertens

03/10/2011 20:17:21
Quote Anchor link
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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.