Toon posts:

[MySQL/SQL] Zoekfunctie op website

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor mijn website ben ik een soort zoekmachine aan het maken die mijn MySQL-database moet gaan doorzoeken op resultaten.

Ik heb nu 10 tabellen die ik moet doorzoeken, en dat doorzoeken doe ik nu nog op 2 velden, namelijk "titel" (varchar(100)) en "tekst" (longtext). Later moet er ook nog een PDF doorzocht worden, maar dat is dus nog een probleem voor later.

Vroegah, toen ik slechts 1 table hoefde te doorzoeken, werkte dit perfect:
SELECT Verslag_ID, Verslag_Titel FROM Verslag WHERE Verslag_Titel LIKE '%#Keyword#%' OR Verslag_Tekst LIKE '%#Keyword#%'

Maarja, ik heb nu 10 tabellen te doorzoeken, dus dan zal die query een draak worden als ik het als volgt ga doen:
SELECT * FROM table_1, table_2, table_3, table_4, table_5, table_6, table_7, table_8, table_9, table_10 WHERE
table_1_titel LIKE '%#Keyword#%' OR table_1_tekst LIKE '%#Keyword#%' OR
table_2_titel LIKE '%#Keyword#%' OR table_2_tekst LIKE '%#Keyword#%' OR
table_3_titel LIKE '%#Keyword#%' OR table_3_tekst LIKE '%#Keyword#%' OR
table_4_titel LIKE '%#Keyword#%' OR table_4_tekst LIKE '%#Keyword#%' OR
table_5_titel LIKE '%#Keyword#%' OR table_5_tekst LIKE '%#Keyword#%' OR
table_6_titel LIKE '%#Keyword#%' OR table_6_tekst LIKE '%#Keyword#%' OR
table_7_titel LIKE '%#Keyword#%' OR table_7_tekst LIKE '%#Keyword#%' OR
table_8_titel LIKE '%#Keyword#%' OR table_8_tekst LIKE '%#Keyword#%' OR
table_9_titel LIKE '%#Keyword#%' OR table_9_tekst LIKE '%#Keyword#%' OR
table_10_titel LIKE '%#Keyword#%' OR table_10_tekst LIKE '%#Keyword#%'

Op de MySQL site ben ik ook de full-text search tegengekomen, maar ik weet niet of dat uberhaupt voor mij zou kunnen werken want die snap ik nog niet helemaal.

Er is nog een ander probleem, als ik de resultaten krijg, dan zullen de links natuurlijk ook allemaal anders moeten zijn, want ik heb 10 verschillende tabellen, en bij sommige van hen moet ik eigenlijk ook nog selecteren op actief/inactief of archief/geen archief...

Misschien moet ik wel met een loopje door de 10 tabelen heen gaan met elk een afzonderlijke query, het zou mooi zijn als ie dan alvast de resultaten van de eerste query uitspuugt voordat ie met de 2e tabel begint...

Maar ik denk dat dat full-text misschien wel iets zou kunnen zijn... Het liefst heb ik zoiets als Google, die automatisch alle juiste links geeft. Ik dacht dat je eerst Google als zoekmachine op je site kon kopen, maar dat kan nu alleen nog voor V.S. en Canada klanten :?

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 09:07
Waarom heb je zoveel tabellen?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Een draak van een query bij een draak van een datamodel. Klinkt als een match!

Maar even zonder dollen, heb je niet het idee dat je hier een enorme overhead op je database aan het genereren bent? Nu doen like queries sowieso al lelijk (overhead technisch gezien, zeker met % aan het begin), maar nu krijg je voor iedere match het inprodukt met de negen overige tabellen.

Je weet hopelijk wel wat het inprodukt is, toch?

Verwijderd

Topicstarter
omdat elke tabel anders ik opgebouwd.

In de ene zit bijvoorbeeld zowat alleen een tekst of alleen een plaatje, en een andere is weer erg uitgebreid met 5 plaatjes, 3 memovelden, 2 datums, archief, tig andere dingen, enzo. Ik vind dat makkelijker. De hele db bestaat trouwens uit 30 tables :)

Als die 10 tabellen nou bijvoorbeeld allemaal producten waren, dan had ik dat heus wel in 1 tabel gestopt met bijvoorbeeld een categorie tabel ernaast. Maar dit zijn echt 10 verschillende tabellen...

[ Voor 31% gewijzigd door Verwijderd op 27-01-2004 17:28 ]


Verwijderd

Topicstarter
bigbeng schreef op 27 januari 2004 @ 17:20:
Een draak van een query bij een draak van een datamodel. Klinkt als een match!

Maar even zonder dollen, heb je niet het idee dat je hier een enorme overhead op je database aan het genereren bent? Nu doen like queries sowieso al lelijk (overhead technisch gezien, zeker met % aan het begin), maar nu krijg je voor iedere match het inprodukt met de negen overige tabellen.

Je weet hopelijk wel wat het inprodukt is, toch?
Hoezo draak van een datamodel?

Dat die query echt niet kan weet ik ook wel, maar het is maar ter illustratie. In het ergste geval zou ik hem splitsen in 10 losse queries, dan krijg je dat inprodukt ook niet...

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Verwijderd schreef op 27 januari 2004 @ 17:25:
[...]


Hoezo draak van een datamodel?

Dat die query echt niet kan weet ik ook wel, maar het is maar ter illustratie. In het ergste geval zou ik hem splitsen in 10 losse queries, dan krijg je dat inprodukt ook niet...
Als er verder geen directe relatie is tussen die tabellen, dan zou ik inderdaad ook 10 losse queries maken.

En dat van die draak moet je maar met een korreltje zout nemen. Maar misschien zou enige normalisatie geen kwaad kunnen. Bijvoorbeeld:
Tabel verslag met verslag_id, titel, tekst
en tabel verslag_plaatje met verslag_id, plaatje
etc...
Als je dan geen plaatje hebt bij een verslag komt er geen record in verslag_plaatje en bovendien wordt die zoekfunctie van jou dan een query op 1 tabel.
Tis maar een ideetje.

Verwijderd

Topicstarter
Hehe, okee thanks :)

Normalisatie is al gebeurd denk ik hoor, tussen de 10 tabellen is inderdaad geen enkele relatie. Alles wat met een veslag te maken heeft (tekst en plaatjes) zit al in de ene tabel verslag...

Maar wat ik me afvroeg als ik hier http://www.mysql.com/doc/en/Fulltext_Search.html naar kijk, zou ik dan voor elke tabel afzonderlijk een full-text moeten toevoegen, of kan ik voor alle 10 tabellen ergens 1 full-text definiëren? Dat zou dan wel die LIKE queries schelen, en als ik het goed begrijp sorteert ie met fulltext ook meteen op relevantie... Begrijp er alleen nog geen bal van, van die MySQL full-text :'(

//edit @hieronder//
je leest verkeerd :)

[ Voor 6% gewijzigd door Verwijderd op 28-01-2004 14:23 ]


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 09:07
Normalisatie is al gebeurd denk ik hoor, tussen de 10 tabellen is inderdaad geen enkele relatie. Alles wat met een veslag te maken heeft (tekst en plaatjes) zit al in de ene tabel verslag...
Of ik lees verkeerd, of jij schrijft verkeerd, of jij bedoeld het inderdaad zo. In dat geval lees jij de tutorials over normalisatie niet goed. Je zet niet alles van verslag bij elkaar maar alle plaatjes. Alle documenten enzovoorts.

  • xantos
  • Registratie: Juni 1999
  • Niet online
Verwijderd schreef op 27 januari 2004 @ 17:38:
Maar wat ik me afvroeg als ik hier http://www.mysql.com/doc/en/Fulltext_Search.html naar kijk, zou ik dan voor elke tabel afzonderlijk een full-text moeten toevoegen, of kan ik voor alle 10 tabellen ergens 1 full-text definiëren? Dat zou dan wel die LIKE queries schelen, en als ik het goed begrijp sorteert ie met fulltext ook meteen op relevantie... Begrijp er alleen nog geen bal van, van die MySQL full-text :'(
Volgens mij moet je dan voor iedere tabel een aparte fulltext-search query maken en die koppelen aan elkaar middels 'UNION'.

Zo zoek ik tenminste door meerdere tabellen. Misschien heb je iets aan.

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 31-03 15:20
Ervanuitgaande dat je aan het bestaande db-model niks kunt/wilt wijzigen, zou ik voor een aparte, extra keyword-tabel gaan. Die moet je wel netjes bijwerken zodra je in één van de tien tabellen een record aanpast, maar zoekt wel een stuk sneller.

Hierbij denk ik dan aan een tabel met de volgende tabellen:
Keyword
Tabel
RecordID

Tabel verwijst naar één van de tien tabellen, RecordID is de waarde van de primary key van het record waar het keyword in voorkomt. Keyword spreekt voor zich.

Een zoek-query heb je dan zo gefixt. Zie het eerste voorbeeld in je openingspost.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
Okee, dat is ook nog een optie!

Ik vrees alleen wel dat er gemiddeld 5 keywords per item bestaan, met een max. van 10 keywords... En als ik meer dan 1 keyword doe, zal ik toch met die LIKE '%blabla%' query moeten zoeken in die aparte tabel vrees ik.

Trouwens, nou zit ik net op Planet http://www.planet.nl/planet/show/id=479040/sc=e0000d en zie ik daar toch ook weer die zoekmachine van Google staan om hun eigen site te doorzoeken! Ik had al geprobeerd daarover informatie en tarieven te krijgen bij Google zelf, maar toen kreeg ik een mailtje terug dat het alleen voor V.S. & Canada klanten beschikbaar is :?

Verwijderd

Alle knotsen, 30 tabellen, dat is wel genoeg lijkt me..!
Maar zonder gekheid, ik weet niet wat je wilt bereiken met de site en wat de doelgroep is, maar die structuur moet toch echt anders lijkt me!

Je gebruikt geen relaties tussen de tabellen begrijp ik? Wellicht daar eens mee starten?

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01

TeeDee

CQB 241

Idee voor je huidige werkwijze:

maak 1 query die zoekt in tabel 1 > geen result? > zoek verder in tabel 2 etc. etc.

of

maak 1 query die zoekt in tabel 1 > result > optie om verder te zoeken in tabel 2 etc. etc.

Dit is imho het meest user friendly met je huidige opzet.

Vervolgens zou ik me inderdaad druk gaan maken om je datamodel.(spuit - 11) Verder: mocht je problemen hebben met je PDF e.d., er zijn bij Acrobat verschillende plugins om PDF's te indexen. Deze indexen kan je middels SQL aanspreken. (mijn ervaring is gebaseerd op IIS Index server, maar er zijn afaik meerdere wegen die naar Rome leiden)

Sterkte :)

[ Voor 9% gewijzigd door TeeDee op 28-01-2004 10:24 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Een goed artikel over de fulltext search: http://www.phpfreakz.nl/artikelen.php?aid=94

succes :)

Verwijderd

Topicstarter
Verwijderd schreef op 28 januari 2004 @ 09:52:
Alle knotsen, 30 tabellen, dat is wel genoeg lijkt me..!
Maar zonder gekheid, ik weet niet wat je wilt bereiken met de site en wat de doelgroep is, maar die structuur moet toch echt anders lijkt me!

Je gebruikt geen relaties tussen de tabellen begrijp ik? Wellicht daar eens mee starten?
Aaargh... sommige tabellen zijn gerelateerd aan elkaar, maar de 10 tabellen in kwestie niet, en dat hoeft ook helemaal niet!

Doelgroep = NL gemeenten

Heb wel aan grotere databases met meer tabellen gewerkt, gieg, projectjes van € 600.000,- (jammer dat ik daar niet echts iets van terugzag op mijn loonstrookje)...

Ik ga denk ik 10 aparte search's doen, al dan niet met een optie tussentijds stoppen en verder zoeken, zoals hierboven is geopperd. Maar misschien splits ik het zoeken wel gewoon in en pulldown met 10 keuzemogelijkheden, dan blijft het gewoon 1 querie per stuk...

In elk geval bedankt voor de input allemaal! :)

Wat betreft de PDF's doorzoeken, heb je misschien een URL van die plug-ins? Voor de volledigheid: de site wordt ontwikkeld met ColdFusion/MySQL en draait nu op RedHat/Apache, maar gaat misschien in de toekomst over naar een Windows 2003 Server.

  • Roeligan
  • Registratie: December 2001
  • Laatst online: 22-07-2025

Roeligan

Feyenoord

Als je met CF werkt is Verity dan misschien niet een optie?

A real man fears not mortality for it's death, he fears mortality for it's lack of life!
RatPack #814


Verwijderd

Topicstarter
Misschien wel, heb wel een stapel papier uitgeprint daarover, maar ik heb daar nog nooit mee gewerkt, en ziet er nogal ingewikkeld uit...

[ Voor 8% gewijzigd door Verwijderd op 28-01-2004 15:22 ]


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Kun je niet een 'master-tabel' maken met daarin alle data waarop je kunt zoeken met liks naar de oorspronkelijke data en vervolgens met de mysql full text search gaan werken? Het is erg eenvoudig.

Je maakt een FULLTEXT index op de kolommen waar je op wilt zoeken
en daarna de query:
SELECT * FROM tabel WHERE MATCH('keyword1 keyword2') AGAINST ('textkolom');
ongeveer.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Fijn dat je hebt besloten om 10 losse queries te doen, immers wil je effectieve queries over verschillende tabellen doen moeten die tabellen wel een overeenkomst hebben, dat kunnen deze 10 tabellen niet hebben.

Zou elke tabel op zich 10 records bevatten zou er eerst een tabel (zonder optimalisatie aan) in het werkgeheugen/hardeschijf gemaakt worden van 10000000000 combinaties. Dat vergt nogal wat van je systeem, laat staan dat er meerdere records in zouden komen :+

Daarnaast ben ik overtuigt dat je database model TOCH NIET genormaliseerd is. Elke tabel heeft een tekst kolom. Waarschijnlijk hangt daar weer een ID aan vast ( soort klantID waarschijnlijk ) Dat zou je kunnen normaliseren en in een eigen tabel zetten. Waardoor je dus slechts EEN query hoeft te doen om te weten welke ID's eraan voldoen.

Kijk dus alsnog eens naar je database model en normaliseer het geheel, je zegt zelf dat je aan grote projecten hebt gewerkt met heel veel tabellen, dan zou je ondertussen moeten weten hoe belangrijk het is om je database model goed te normaliseren om alles optimaal te laten werken.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Als de tabellen niets met elkaar te maken hebben is het dan geen idee om gewoon een gebruiker te laten selecteren wat hij wil zoeken??? Want iemand weet toch wel of hij een verslag of een fax of iets anders zoekt, als dit niet zo is, dan zou ik gaan werken met een aparte zoekmachine die dus een losse tabel aanmaakt met zoekwoorden. Want met like %tekst% queries op grotere tabellen te gaan werken is een beetje dramatisch voor je performance.

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
bigbeng schreef op 27 januari 2004 @ 17:20:
Je weet hopelijk wel wat het inprodukt is, toch?
Jij kennelijk niet. Wat je bedoelt is het cartesisch product.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Mocht je nog voor Google willen gaan:

Maak gebruik van SOAP om Google te querien
Met google-interface je eigen site doorzoeken

[ Voor 8% gewijzigd door Spider.007 op 28-01-2004 18:31 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Verwijderd

Topicstarter
Gomez12 schreef op 28 januari 2004 @ 18:18:
Als de tabellen niets met elkaar te maken hebben is het dan geen idee om gewoon een gebruiker te laten selecteren wat hij wil zoeken??? Want iemand weet toch wel of hij een verslag of een fax of iets anders zoekt, als dit niet zo is, dan zou ik gaan werken met een aparte zoekmachine die dus een losse tabel aanmaakt met zoekwoorden. Want met like %tekst% queries op grotere tabellen te gaan werken is een beetje dramatisch voor je performance.
Precies, gelijk heb je. Dat is precies zoals ik het inmiddels gedaan heb! :+

Ik zal de fulltext opties nog bestuderen en eventueel later nog toevoegen, ben ook niet zo blij met die LIKE.

De Google opties zal ik ook nog naar kijken (altijd handig)! Probleem is wel dat de meeste inhoud achter een met een wachtwoord beveiligd gedeelte zit. En de databaselinks worden meestal ook niet 'gepakt' met Google.

Thanks all!

[ Voor 9% gewijzigd door Verwijderd op 29-01-2004 04:47 ]

Pagina: 1