[PHP] Zoekfunctie + Query[MYSQL]

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ik ben bezig een zoekfunctie te maken. Hier heb ik enkele vragen over...

1. Ik dacht eerst dat een zoek-query met 'WHERE data like=%beeld%' beter was dan een fulltext search zoekactie. Het probleem dat ik had was dat ik meer resultaten kreeg dan gewenst omdat de query ook resultaten terug geeft zoals 'beeldscherm'. Dit terwijl ik eigenlijk alleen resultaten wil zien met het woord 'beeld'.

Hierna heb ik een query geprobeerd met een reguliere expressie: 'WHERE data regexp ''[^a-z]beeld[^a-z]'' zodat er geen characters achter en voor het woord 'beeld' mogen voorkomen. Dit werkt opzich goed, alleen duurt de query nu meer dan 10 keer zo lang.

Is hier een betere oplossing voor of kan ik toch beter de fulltext search functie van mysql gebruiken?

2. De tweede vraag is of ik een query tussentijds kan afbreken als die te lang duurt. (net zoals de search op dit forum). Ik kan hier helaas weinig info over vinden.

Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

'WHERE data like=% beeld %'

Spaties toevoegen ?

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • DizzyWeb
  • Registratie: Februari 2001
  • Laatst online: 05-09 14:30

DizzyWeb

Ondertiteld

Als je spaties toevoegt, dan matcht ie niet als beeld het laatste woord van de string is.

Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

'WHERE data LIKE '% beeld'
OR data LIKE 'beeld %'
OR data LIKE '% beeld %'

Weet niet wat je querytijd zal worden... met 3 LIKE's

[ Voor 27% gewijzigd door glashio op 13-01-2004 13:30 ]

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • glashio
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:13

glashio

C64 > AMIGA > PC

Oeps

[ Voor 99% gewijzigd door glashio op 13-01-2004 13:29 ]

> Google Certified Searcher
> Make users so committed to Google that it would be painful to leave
> C64 Gospel
> [SjoQ] = SjoQing


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Het % teken is een joker, dus kan in plaats van elke set letter/cijfer etc. Je zou dus gewoon WHERE `data` LIKE 'beeld' moeten gebruiken. Overigens is het volgens mij wel sneller om een FULL TEXT search te gebruiken. Deze maakt namelijk gebruik van een special index op de betreffende velden hiervoor (als ik me niet vergis).

Voor het afbreken van je query kun je de conntect_timeout instelling in je php.ini gebruiken. Je moet dan echter wel pas connecten als je de query hebt opgebouwd en direct na het connecten de query uitvoerd. Meer info hierover op deze pagina.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
glashio schreef op 13 januari 2004 @ 13:28:
'WHERE data LIKE '% beeld'
OR data LIKE 'beeld %'
OR data LIKE '% beeld %'

Weet niet wat je querytijd zal worden... met 3 LIKE's
Stja... ik zal het eens proberen maar mooi is anders.. Het moet namelijk mogelijk zijn om op meerdere woorden te zoeken. Als ik dan telkens 3 likes moet gebruiken wordt de query wel erg vies.

Zitten er trouwens nadelen aan het gebruik van de fulltext search optie van mysql?

Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Michali schreef op 13 januari 2004 @ 13:53:
Het % teken is een joker, dus kan in plaats van elke set letter/cijfer etc. Je zou dus gewoon WHERE `data` LIKE 'beeld' moeten gebruiken.
Mijn data veld (mediumtext) bevat meestal een tekst als 'bla bla bla een heel verhaal en dan het woordje beeld bla bla en nog veel meer.'

Ik kan dus geen like 'beeld' gebruiken als je begrijpt wat ik bedoel.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

xantos schreef op 13 januari 2004 @ 13:15:
1. Ik dacht eerst dat een zoek-query met 'WHERE data like=%beeld%' beter was dan een fulltext search zoekactie.
Even bij het begin beginnen. Waarom denk je dat? Waarom denk je dat een systeem dat het database systeem aanbied om te zoeken naar een woord in textveld van een tabel trager is dan een eigen implementatie hiervan? Heb je dit getest? Missen er bepaalde onderdelen in de implementatie die jij nodig hebt?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Janoz schreef op 13 januari 2004 @ 13:59:
[...]
Even bij het begin beginnen. Waarom denk je dat? Waarom denk je dat een systeem dat het database systeem aanbied om te zoeken naar een woord in textveld van een tabel trager is dan een eigen implementatie hiervan? Heb je dit getest? Missen er bepaalde onderdelen in de implementatie die jij nodig hebt?
stja.. dat is goeie vraag. Ik dacht dat in een posting op dit forum gelezen te hebben maar ik kan 'm zo snel niet meer terug vinden.

Ik heb inderdaad de fulltext search nog niet geprobeerd maar dat ga ik zeker doen.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Full tekst is erg gemakkelijk te gebruiken, het wordt helemaal handig in MySQL >= 4.14 (dacht ik) waar namelijk boolean vergelijkingen kunt uitvoeren op de zoek informatie (docs).

Zo'n query zou er dan zo kunnen uitzien:

SELECT `table`.*, MATCH (data) AGAINST ('beeld') as `relevance` FROM `table` WHERE MATCH (data) AGAINST ('beeld')

[ Voor 13% gewijzigd door Michali op 13-01-2004 14:23 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
Ok, de fulltext search werkt best goed. Nu wil ik alleen per pagina steeds 10 resultaten laten zien middels de LIMIT optie in Mysql.

Mijn query bestaat uit meerdere SELECTS koppelt via 'UNION'. Kan ik dan nog gebruik maken van 'SQL_CALC_FOUND_ROWS' om het totaal aantal records op te vragen? Dit lukt me namelijk niet.

Acties:
  • 0 Henk 'm!

  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 19-09 17:00
je kan toch toch ook count() gebruiken icm dezelfde syntaxis?

Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
niet als ik dit doe in combinatie met LIMIT 10. Ik krijg dan maar de eerste 10 rijen te zien en mijn count zal de rest ook niet tellen.

Acties:
  • 0 Henk 'm!

  • FlowinG
  • Registratie: Maart 2003
  • Laatst online: 19-09 17:00
ik bedoel dus, dat je dezelfde "WHERE"-syntaxis gebruikt, alleen dan selecteer je niet de kollommen maar alleen de count. Dus als je normaal zoekt op
code:
1
SELECT * FROM tabel WHERE getal > 1 AND actueel = 'yes' LIMIT 0,10
Zoek je nu op
code:
1
 SELECT count(id) FROM tabel WHERE getal > 1 AND actueel = 'yes'
. Je gebruikt in principe dezelfde query alleen geeft mysql alleen het getal terug. En als je bang bent voor performance problemen, kan je eventueel het getal in een sessie ofzoiets en dat weer gebruiken op je volgende pagina.

Acties:
  • 0 Henk 'm!

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
xantos schreef op 15 januari 2004 @ 10:04:
Ok, de fulltext search werkt best goed. Nu wil ik alleen per pagina steeds 10 resultaten laten zien middels de LIMIT optie in Mysql.

Mijn query bestaat uit meerdere SELECTS koppelt via 'UNION'. Kan ik dan nog gebruik maken van 'SQL_CALC_FOUND_ROWS' om het totaal aantal records op te vragen? Dit lukt me namelijk niet.
lijkt me niet dat je dat in je db-query moet doen, maar in je applicatie (in asp is dat in ieder geval wel mogelijken en aangezien mijn ervaring met php 0,01 is O-) )

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Acties:
  • 0 Henk 'm!

  • xantos
  • Registratie: Juni 1999
  • Niet online
ok, ik heb het als volgt gedaan.

Ik doorloop gewoon mijn hele resultset en druk dan middels een 'for' lus de juiste records af op het scherm. Heb ik ook meteen mijn totaal aantal records.

Acties:
  • 0 Henk 'm!

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 14:41

Salandur

Software Engineer

Je kan in PHP het aantal resultaten opvragen met de functie mysql_num_rows($resultaat). En je kan ook met de functie mysql_result (zie http://nl.php.net/manual/nl/function.mysql-result.php) een bepaalde rij op halen. De for-lus is wel goed natuurlijk :)

Assumptions are the mother of all fuck ups | iRacing Profiel

Pagina: 1