Toon posts:

[MySQL] search verfijnen

Pagina: 1
Acties:
  • 1.188 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

Ik ben een PHP/MySQL-site aan het bouwen, en nu heb ik een vraagje over de zoekfunctie. Ik laat de gebruiker middels checkboxes kiezen of hij wil zoeken in de title (title) en/of in het artikel zelf (content).

De sql-query ziet er dan als volgt uit indien de gebruiker in beide velden wil zoeken:

$sql = "SELECT id, title. lastmodified FROM table_name WHERE title LIKE '%$searchInput%' OR content LIKE '%$searchInput%' ORDER BY lastmodified DESC";

Nu valt me een ding op, en ik begrijp ook waarom - alleen weet nog niet hoe ik het zo eenvoudig mogelijk aanpas: als ik zoek op 1 zoekterm, gaat alles goed. Zoek ik echter op 2 termen, waarvan er eentje in title staat, en eentje in content, dan gaat het mis. Waarschijnlijk zal het ook al mis gaan als ik twee woorden uit de titel ingeef die niet direct na elkaar staan..

Ik neem aan dat hij letterlijk naar deze search string gaat zoeken, echter wat de bedoeling is, is dat hij naar de woorden afzonderlijk gaat zoeken.

Hoe kan ik dit het beste aanpakken?

Pieter

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Euh... dit is toch redelijk basic SQL:

SQL:
1
2
3
4
5
SELECT id, title. lastmodified
FROM table_name
WHERE (title LIKE '%searchInput1%' OR content LIKE '%searchInput1%')
  and (title LIKE '%searchInput2%' OR content LIKE '%searchInput2%')
ORDER BY lastmodified DESC

Nu wordt (dankzij de and) naar beide woorden gezocht. Gewoon je string splitten op spaties en je Query dynamisch opbouwen.
Overigens zou ik me eens verdiepen in het fenomeen "Full text search", dat is beter dan een LIKE loslaten op een bult data ;)

Ook krijg je een title-change van me want dit heeft niks met PHP te maken (tenzij je straks in PHP je query's gaat opbouwen) maar gaat over SQL.

Titelfix: [PHP] MySQL search verfijnen -> [MySQL] search verfijnen

(en dan is het eigenlijk nog niet eens MySQL specifiek ;) )

[ Voor 25% gewijzigd door RobIII op 14-09-2006 19:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 21:42

MBV

ophakken in aparte argumenten, met explode. Vervolgens zoeken op
code:
1
WHERE title LIKE %".$input[0]."% OR title LIKE $".$input[1]." OR ....

Dat is het makkelijkste. Met AND en OR kan je spelen om het gewenste resultaat te krijgen. Uiteraard moet je het niet statisch doen, maar met een for-loopje door alle input-waarden heen gaan. Uiteraard gaat dit niet echt lekker werken als je load wat hoger wordt, dan zal je toch echt een index op moeten bouwen lijkt me.

Maareh, waarom het wiel opnieuw uitvinden?

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

Waarom het wiel opnieuw uitvinden - inderdaad - en waarom in vredesnaam op deze manier? Wanneer je veel content hebt, word dit onhandelbaar en krijg je vaak irrelevante resultaten. Probeer eens iets in elkaar te knutselen met bewezen software, zoals swish-e of xapian.

[ Voor 1% gewijzigd door GX op 14-09-2006 20:16 . Reden: Wat een stijlfouten, het zal wel laat zijn ]


  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Opsplitsen?, Volgens mij werkt dit ook:

PHP:
1
2
$search = str_replace(' ', '%', $search);
$sql = 'WHERE title LIKE %' . $search . '%';

March of the Eagles


Verwijderd

Topicstarter
Hacku schreef op donderdag 14 september 2006 @ 21:54:
Opsplitsen?, Volgens mij werkt dit ook:

PHP:
1
2
$search = str_replace(' ', '%', $search);
$sql = 'WHERE title LIKE %' . $search . '%';
Dank je, ziet eruit als een goede suggestie die ik zeker als eerste ga proberen!

Ook merci voor de overige tips, Swish-e en Xapian kende ik niet. Niet bepaald op het idee gekomen om hierop te gaan Googlen wat betreft kant en klaar code. Full text search ziet er ook goed uit gezien de relevantie index.. Alleen probeer ik in eerste instantie ook nog zelf een beetje te begrijpen wat ik doe, vandaar dat ik niet direct andersmans componenten ga installeren. Zodra ik de basis zelf snap, vind ik het wel leuk om wat verder te experimenteren, eerder wacht ik daar liever mee.

Vooropgesteld: de huidige site zal nog wel meer onvolkomenheden hebben, ik beschouw het als een prototype om enkele zaken te testen. Als dat goed lukt en de hoeveelheid content groeit, zullen er nog wel wat aanpassingen nodig zijn, echter die kosten me nu denk ik een stuk meer tijd terwijl ik niet weet of het de investering waard is.

Thx, Pieter

  • Japidoff
  • Registratie: November 2001
  • Laatst online: 16-01 18:20
ff snel een tip:
ik lees dit zo door en denk: SQL injection?
omdat je je variabelen direct in je sql gaat gebruiken
dus denk aan je quotes enzow...
Hacku schreef op donderdag 14 september 2006 @ 21:54:
Opsplitsen?, Volgens mij werkt dit ook:

PHP:
1
2
$search = str_replace(' ', '%', $search);
$sql = 'WHERE title LIKE %' . $search . '%';
weet iemand zeker dat sit werkt??

vlgns mij krijg je dan "word%other%word%" en ik dacht niet dat dat werkte in sql...

[ Voor 56% gewijzigd door Japidoff op 14-09-2006 22:27 ]

gang is alles


  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Zo'n string krijg je idd en hier (MySQL 5) werkt dat perfect :) Mijn zoekresultaten kloppen iig steeds.

March of the Eagles


  • Japidoff
  • Registratie: November 2001
  • Laatst online: 16-01 18:20
Hacku schreef op donderdag 14 september 2006 @ 22:29:
Zo'n string krijg je idd en hier (MySQL 5) werkt dat perfect :) Mijn zoekresultaten kloppen iig steeds.
offtopic:
okdan, en zo leren we elke dag weer wat bij!
kzal die mysql docs er weer eens bij pakken...

gang is alles


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Hacku schreef op donderdag 14 september 2006 @ 22:29:
Zo'n string krijg je idd en hier (MySQL 5) werkt dat perfect :) Mijn zoekresultaten kloppen iig steeds.
De resultaten kloppen alleen als de woorden ook in die volgorde in de tekst staan.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hacku schreef op donderdag 14 september 2006 @ 21:54:
Opsplitsen?, Volgens mij werkt dit ook:

PHP:
1
2
$search = str_replace(' ', '%', $search);
$sql = 'WHERE title LIKE %' . $search . '%';
Zie de reactie van _js_ hierboven. Dit "geintje" werkt inderdaad alleen als de woorden in die volgorde staan, en dat is niet altijd het geval neem ik aan.

*mompel*
Wat ik waardeer aan TS is juist dat hij zelf aan de slag wil met SQL zonder er andermans "wiel" aan te pas te willen laten komen. Het is inderdaad niet altijd even handig om het wiel opnieuw uit te vinden (en soms zelfs te duur/tijdrovend/minder goed en ga zo maar door), maar het is soms wel handig om te weten hoe een wiel werkt; en dat is toch wat we min of meer hier in PRG doen ;)
*mompel*

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
RobIII schreef op donderdag 14 september 2006 @ 19:18:
Overigens zou ik me eens verdiepen in het fenomeen "Full text search", dat is beter dan een LIKE loslaten op een bult data ;)
Dank je, dit was een gouden tip! Ik heb eerst het andere truukje geprobeerd, maar dit is ronduit fantastisch! Ik kende het niet, nooit van gehoord... terwijl ik zie dat het toch al een tijd bestaat. Enfin, ben weer uit de grot gekropen waar ik de laatste jaren blijkbaar in gezeten heb! *grin*

Hartelijk dank, probleem is opgelost!

(en proficiat met de kleine... leuke site!)

Pieter

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Note dat full text search alleen met MyISAM tabellen werkt, dus mocht je InnoDB gebruiken zal het niet werken.

March of the Eagles

Pagina: 1