[mysql] (LIKE) zoek op woord maar niet op een gedeelte ervan

Pagina: 1
Acties:

  • js303
  • Registratie: April 2003
  • Laatst online: 08-05 18:22
ik heb momenteel een searchpagina op een site draaien die kan zoeken op woorden a la SELECT fields FROM table WHERE content LIKE '%word%'

echter met LIKE worden logischerwijs ook delen van woorden weergegeven, zoals bijv. simon in simonis of great in greater. is er een truuk om - als de user op great zoekt - alleen op een heel woord resultaten te geven en niet als het een deel van een woord is? of moet ik dat vervolgens weer met bijv. PHP gaan uitfilteren? een manier zou kunnen zijn WHERE content LIKE '%word %' (dus met een spatie erachter, maar stel dat het woord aan het eind van een zin voorkomt dan wordt het weer niet geselecteerd...

m'n uiteindelijke 'plan' is om een set aparte indexeertabellen te maken waar tabel 1 een lijst met unique keywords bevat en tabel 2 een kruistabel tussen de keywords-tabel en de content-tabel(len). echter momenteel zoek ik even naar een tijdelijke oplossing. is er een truuk om bovenstaande voor mekaar te krijgen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Als je MySQL gebruikt:
http://dev.mysql.com/doc/mysql/en/regexp.html
* NMe kijkt in topictitel. Ah, je gebruikt dus idd MySQL. :P

[ Voor 34% gewijzigd door NMe op 11-03-2005 20:44 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 00:01
js303 schreef op vrijdag 11 maart 2005 @ 20:40:
Echter met LIKE worden logischerwijs ook delen van woorden weergegeven, zoals bijv. simon in simonis of great in greater. is er een truuk om - als de user op great zoekt - alleen op een heel woord resultaten te geven en niet als het een deel van een woord is? of moet ik dat vervolgens weer met bijv. PHP gaan uitfilteren? een manier zou kunnen zijn WHERE content LIKE '%word %' (dus met een spatie erachter, maar stel dat het woord aan het eind van een zin voorkomt dan wordt het weer niet geselecteerd...
Je hebt al de helft van de oplossing. M.b.v. vierkante haken kan je ook specifieke letters zoeken. In jouw geval kan je dus zoeken naar: '% woord[ .,]%'
Nu zoek je naar een spatie gevolgd door het woord, ne gevolgd door (een spatie òf een punt òf een komma). Hier zijn meer tekens aan toe te voegen.
Eventueel kan je uitwijken naar regexp, maar die is in het algemeen ietsje langzamer.

  • js303
  • Registratie: April 2003
  • Laatst online: 08-05 18:22
[b]jouw geval kan je dus zoeken naar: '% woord[ .,]%'
Nu zoek je naar een spatie gevolgd door het woord, ne gevolgd door (een spatie òf een punt òf een komma). Hier zijn meer tekens aan toe te voegen.
hmmm, ik krijg 0 results als ik LIKE '% word[ .,]%' gebruik. met LIKE '% word %' krijg ik wel results. draai mysql 3.23. kan hier verder ook geen info over vinden op http://dev.mysql.com/doc/...comparison-functions.html.

[ Voor 9% gewijzigd door js303 op 12-03-2005 19:09 ]


  • tombo_inc
  • Registratie: December 2004
  • Laatst online: 10-03 13:21

tombo_inc

uhuh

misschien bieden match() against() wel uitkomsten.
kijk hier maar eens http://dev.mysql.com/doc/mysql/en/fulltext-search.html

Microsoft Windows: A thirty-two bit extension and graphical shell to a sixteen-bit patch to an eight-bit operating system originally coded for a four-bit microprocessor which was written by a two-bit company that can't stand one bit of competition


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

js303 schreef op zaterdag 12 maart 2005 @ 19:08:
hmmm, ik krijg 0 results als ik LIKE '% word[ .,]%' gebruik. met LIKE '% word %' krijg ik wel results. draai mysql 3.23. kan hier verder ook geen info over vinden op http://dev.mysql.com/doc/...comparison-functions.html.
RegExp al geprobeerd? :P Zo ja: waarom voldoet dat niet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • js303
  • Registratie: April 2003
  • Laatst online: 08-05 18:22
-NMe- schreef op zaterdag 12 maart 2005 @ 21:06:
[...]

RegExp al geprobeerd? :P Zo ja: waarom voldoet dat niet?
idd RegExp werkt prima, hoewel het wel tikkie langzamer is dan LIKE bij 'dezelfde' query. waar de LIKE in mijn geval tussen de 0.04 ~ 0.07 secs over doet loopt de REGEXP tussen de 0.07 ~ 0.09 secs... ik laat het even op RegExp staan maar voor de lange termijn lijkt me een indexeertabel toch wenselijk maar das een ander verhaal... regexp werkt iig :)

code:
1
WHERE table.field REGEXP '[ ]word[ .,!?:;]'

[ Voor 3% gewijzigd door js303 op 13-03-2005 01:00 ]


  • PanMan
  • Registratie: November 1999
  • Laatst online: 10-05 16:31

PanMan

Spun!

MySQL kan ook een fulltext search doen. Een klant van me was daar niet tevreden mee omdat er alleen op hele woorden gezocht kon worden (er wordt een index van alle woorden aangelegd, als ik het goed heb). Maar wellicht is dat dus precies wat je zoekt.
Geeft ook nog iets van relevantie, danwel hoevaak een woord voorkomt, en dus iets meer info dan een LIKE query. En is, bij erg grote tabellen, een stuk sneller. Kan je zo info over vinden in de mysql docs...

Where a calculator on the ENIAC is equipped with 18,000 vacuum tubes and weighs 30 tons, computers in the future may have only 1,000 vacuum tubes and weigh only 1.5 tons.
– Popular Mechanics, March 1949

Pagina: 1