Keyword search match against

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mike V

Mike V

18/11/2011 11:50:14
Quote Anchor link
Beste mensen,

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?
 
PHP hulp

PHP hulp

26/11/2024 14:10:50
 
Kees Schepers

kees Schepers

18/11/2011 11:58:36
Quote Anchor link
Hallo Mike,

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.
 
Mike V

Mike V

18/11/2011 12:06:49
Quote Anchor link
bij de keywords "Jachthaven amsterdam" wordt de jachthaven wel gevonden, maar ook de rest in Amsterdam, wat dus echt niet moet.

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?
 
Kees Schepers

kees Schepers

18/11/2011 12:14:36
Quote Anchor link
Ik vind je vraag echt te vaag omschreven om nou echt goed te begrijpen wat je wilt. Kun je anders voor een voorbeeld maken met wat er opgeslagen is in de database en welke zoekvraag welke resultaten op zou moeten leveren. Voorbeeld:

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?


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
 
Mike V

Mike V

18/11/2011 12:39:21
Quote Anchor link
Ja met een loopje de keyword uit elkaar halen en dan kijken of er een stad in zit kost veel te veel resources, dus ik heb een extra veld gemaakt 'keywords' waar stad, adres en de naam door elkaar staan hier is een voorbeeld row:

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?)
 
Kees Schepers

kees Schepers

18/11/2011 12:49:47
Quote Anchor link
Maar als jij een full-text index hebt op het kolom keywords en je zoekt op "Knegsel stee" moet hij record 1 gewoon vinden. Ik denk dat je sowieso in boolean modus moet zoeken om te bereiken wat jij wilt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE MATCH(keywords) AGAINST('knegsel stee' IN BOOLEAN MODE)


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.


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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/11/2011 13:21:18
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$searcharr
= explode(' ', $searchstr);
$where = 'WHERE';
for ($i=0;$i<count($searcharr);$i++) {
    if (i > 0) $where .= ' AND';
    $where .= " keywords LIKE '% " . $searcharr[$i] . " %'";
}

$sql = "SELECT id, adres, name, zipcode, city FROM tabel " . $where;
?>
 



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.