Keyword search match against
De situatie is alsvolgt: ik heb een kolom 'keywords' waar in de naam, stad en adres in voorkomen. Nu heb ik ook die kolom een fulltext index, en wil ik match against gebruiken.
Het probleem is, stel dat de user input is "jachthaven amsterdam" dan moet hij zoeken op jachthavens in amsterdam, alleen dit werkt niet omdat je nooit kan achterhalen wat de bedrijfsnaam is, anders zou het heel simpel kwestie van explode zijn op spatie, alleen een bedrijfsnaam kan meer dan 2 woorden hebben.
Kan iemand me hier mee helpen?
Je hebt dus een kolom waar een bedrijfsnaam, stad en adres in opgeslagen worden? Als je op deze kolom een fulltext index zet dan zou dat gewoon moeten werken want een fulltext index tokenized de waarde die in je kolom staat en ziet dan dus stel je hebt in de betreffende kolom een waarde "Jachthaven amsterdam" staan wordt dit in een fulltext index als twee worden gezien.
Mocht ik je probleem niet begrijpen zou je dan wat aanvullende informatie verschaffen? Zoals de index (exact) die je gedefineerd hebt, tabel design en uiteraard de query die je probeert uit te voeren.
id adres name zipcode city kvk_number keywords branch
id = prim key
keywords = full text index
Dus ik moet kunnen zoeken naar bedrijven in een bepaalde stad, maar het vervelende is dat je nooit weet hoeveel letters een stad is, ik heb het nu in 2 textboxen, dus 1 is de naam van het bedrijf 2 is de naam van de stad, maar ik wil het samen voegen.
Toevoeging op 18/11/2011 12:12:41:
Eigenlijk moet ik een soort van query hebben die werkt alsvolgt:
Userinput: "Timmerbedrijf Van Der Aar Nijmegen"
Regex, split alles waar een spatie op zit:
Timmerbedrijf
Van
Der
Aar
Nijmegen
ga ze allemaal af totdat je de stad hebt en zoek vervolgens in de kolom naam, als de stad niet is in gevuld dus bv: "Timmerbedrijf van der Aar" dan moet hij dus eerst kijken van oww staat er een stad in zo nee zoek op naam,
hoe kan ik dit het beste oplossen?
id naam
25 jachthaven amsterdam
30 blaat amsterdam
MATCH(keywords) AGAINST("amsterdam")
Verwacht resultaat: 25, 30
Werkelijk resultaat: 25
Iets in die richting? Dan kan ik je wellicht helpen.
Verder zijn de mogelijkheden met Query operators in Full-Text search met MySQL veelzijdig en is wellicht interresant om je daar eens in te verdiepen: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
Quote:
Timmerbedrijf
Van
Der
Aar
Nijmegen
ga ze allemaal af totdat je de stad hebt en zoek vervolgens in de kolom naam, als de stad niet is in gevuld dus bv: "Timmerbedrijf van der Aar" dan moet hij dus eerst kijken van oww staat er een stad in zo nee zoek op naam,
hoe kan ik dit het beste oplossen?
Van
Der
Aar
Nijmegen
ga ze allemaal af totdat je de stad hebt en zoek vervolgens in de kolom naam, als de stad niet is in gevuld dus bv: "Timmerbedrijf van der Aar" dan moet hij dus eerst kijken van oww staat er een stad in zo nee zoek op naam,
hoe kan ik dit het beste oplossen?
Dit is iets heel anders. Je moet dan inderdaad het keyword veld op een spatie uit elkaar halen met bijvoorbeeld strtok, en in en loopje controleren of er een plaatsnaam in zit. Dus je zult dan een index/tabel/array met plaatsnamen moeten hebben voordat je die match kunt maken.
Gewijzigd op 18/11/2011 12:22:20 door kees Schepers
id, adres, name, zipcode, city, keywords
1, straat 1, van der stee, 5571 AI, Knegsel, van der stee knegsel
Dus je ziet dat in het laatste veld (keywords) al die termen er in staan, nu is de vraag alleen nog stel mijn user input is:
"knegsel stee", hoe kan ik hem laten zoeken (met een %like% vind hij hem niet omdat er dus "van der" voor staat en de volgorde is anders, hij moet gewoon echt letterlijk alle dingen die er ook maar in voorkomen mee nemen in de resultaten, hoe kan ik dit doen (met een regexp perhaps maar hoe?)
Wat studie zou je geen kwaad doen (goed bedoeld):
Quote:
(no operator)
By default (when neither + nor - is specified) the word is optional, but the rows that contain it are rated higher. This mimics the behavior of MATCH() ... AGAINST() without the IN BOOLEAN MODE modifier.
By default (when neither + nor - is specified) the word is optional, but the rows that contain it are rated higher. This mimics the behavior of MATCH() ... AGAINST() without the IN BOOLEAN MODE modifier.
Lees deze ook eens goed door voor goede tips: http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html Wist ook niet dat MySQL dit ondersteunde: http://dev.mysql.com/doc/refman/5.0/en/fulltext-query-expansion.html
Gewijzigd op 18/11/2011 12:51:47 door kees Schepers