Zoek query

Status
Niet open voor verdere reacties.

bn2vs

Terugkerende gebruiker
Lid geworden
18 aug 2007
Berichten
1.705
Hey,

Ik wil een zoek optie voor tussen een aantal producten te zoeken.
Elk product heeft een beschrijving, specs, een titel, een arteiekel nr en prijs.
Op alls behalve de prijs moet gezocht worden.

Ik heb momenteel iets in de aard van

Code:
$keywords = explode(" ", $_GET["search"]);
$pattern = "%";
foreach ($keywords as $keyword) $pattern .= $keyword."%";

$db->Query("SELECT DISTINCT beschrijving, specs, titel, artnr, prijs 
                     FROM producten
                     WHERE beschrijving LIKE '$pattern' OR specs LIKE '$pattern' OR titel LIKE '$pattern' OR arteiekel LIKE '$pattern'")

Nu, dat werkt leuk, als er bv een product is dat 'laptop merk model' noemt, dan retourneet die dat rpoduct voor elk keyword, delen van die keywords, meerdere overeenkomende keywords die in de juiste volgorde staan.

Nu wil ik dat die ook een resultaat retourneet als je op 'model merk' zoekt enzo :)
En dat ik de resultaten kan rangschikken naar gelang de hoeveelheid keyword matches, en of ze al dan niet in de titel staan.

Iemand een idee hoe die query er dan uit ziet?
 
Help!!! Ik geraak er maar niet uit!
 
Oef; een query die op zoveel verschillende vlakken zoekt en dan ook nog sorteert op het aantal keyword hits...

Eerlijk gezegd is dit een behoorlijk vraagstuk waar je waarschijnlijk een hele tijd over na kunt denken...

Ik zou je met zo weinig informatie denk ik niet echt verder kunnen helpen :(
 
Misschien is de zoekfunctie van MySQL een optie? Lees dit artikel eens om te kijken of het iets voor je is: http://netters.nl/fulltext-search-in-mysql

Er zit één foutje in het artikel, namelijk dit voorbeeld:
PHP:
SELECT * FROM tabel MATCH(titel, tekst) AGAINST('zoek en vind')
Moet zijn:
PHP:
SELECT * FROM WHERE tabel MATCH(titel, tekst) AGAINST('zoek en vind')

Succes!
 
Hey,

Dat lijkt me hetgeen wat ik zocht :)
Heel erg bendakt! :thumb:

EDIT:
Je hebt echter ook een fout in je query xD wss gewoon verkeerd gepsate :p
SELECT * FROM tabel WHERE MATCH(titel, tekst) AGAINST('zoek en vind')
 
Laatst bewerkt:
Ik heb nog steeds problemen met deze query :(

ALs ik het met fulltext doe krijch ik geen resultaten terug om een of andere reden. Wat me opvalt is dat de fulltext index in mn db als Cardinality waarde 1 heeft, en de rest evenveel als er records zijn. Kan dit het probleem zijn?

Een goed, grondig overzicht van fulltext sql search zou ook wel handig zijn, maar vind nergens iets.

Alvast bedankt :)
 
Hey,

Blijkbaar doet die het wel, maar de resultaten die ik terug krijch zijn niet altijd wat ik wens.

Als ik op 'laptop' zoek krijg ik wel leuke resultaten terug, maar als ik 'lap' typ, krijch ik nix terug :( Idem voor alle andere zoekwoorden die ik geprobeerd heb. Er moet blijkbaar minstens 1 volledige match zijn voordat ik resultaten terugkrijg. Is er een manier om ook resultaten te laten retourneren als het zoekwoord enkel als deel van een ander woord voorkomt?

Alvast bedankt :)
 
De minimale lengte van een woord moet 4 tekens zijn, tenminste dat is de standaard instelling. In een config van mysql zou ergens de variable "ft_min_word_len" moeten zitten. Ik weet zelf ook niet precies hoe het zit, maar hier heb ik wat leesvoer gevonden over fulltext indexen: http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

Misschien ook wel handig, als je ingelogd bent in mysql kun je op deze manier de waarde van variabelen opvragen:
PHP:
mysql> SHOW VARIABLES LIKE 'ft_m%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| ft_max_word_len | 84    |
| ft_min_word_len | 4     |
+-----------------+-------+
2 rows in set (0.00 sec)
 
Hey,

Heb ff gechecked, en die variabelen hebben dezelfde waarde. Ik krijch echter pas resultaten terug vanaf 5 characters ipv 4.

Stel nu dat er zowel records zijn met inhoud 'gray', 'black' en 'laptop', dan krijch ik deze resultaten.
gray => nix (zou wel moeten :()
black => alles waar black in zit
laptop => alles waar laptop in zit
lapto => nix (zou wel moeten :()

Ik ga nu ff proberen die min lengte te veranderen, maar dat gaat het probleem van 'halve' woorden niet oplossen.

Een (deelse) oplossing hiervoor zou kunnen zijn ook er een lame OR LIKE blij te zetten. Natuurlijk wil ik die resultaten die die LIKE oplevert na die van de fulltext hebben. Dat gaat als ik op hun fulltext relevantie kan sorteren, maar vind niet direct hoe ik dat kan doen zonder de fulltext zooi 2x in mn query te hebben.

Kan dit korter?
Code:
SELECT id, MATCH (title,body) AGAINST ('Tutorial') FROM blaat WHERE MATCH (title,body) AGAINST ('Tutorial')

Alvast bedankt :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan