[mysql] goede zoek functie

Pagina: 1
Acties:

  • ddofborg
  • Registratie: Augustus 2000
  • Laatst online: 26-02 09:52
Ik ga met een vriend van mij een film-database-website bouwen (300.000 films :P), en op die site wil ik een goede zoekfunctie hebben.

Gebruikte toolz:
- MySQL 3.23.23 (laatste stable)
- PHP 4.1.2
- OS: Linux, maar het zal niet veel uitmaken denk ik...

Het zoeken naar woorden die goed zijn gespeld is geen probleem, maar zoeken naar woorden die fout gespeld zijn, is een stuk lastiger.

Dus als ik in die database 'James Bond: Tomorrow Never Dies' heb, dan vind ik het niet als ik op 'tommorrow' zoek.

Ik maak gebruik van geindexeerde kolomen (om het een beetje snel te laten lopen :)
code:
1
SELECT * FROM Movies WHERE MATCH (title) AGAINST ('bond');

zoeken met de bovenstaande query gaat wer goed en snel, maar nadeel is dat je niet op wildcards kan zoeken (ik heb niet kunnen vinden hoe) dus niet 'jame*' ofzo...

Zoeken met
code:
1
SELECT * FROM Movies WHERE title LIKE 'jame%';

is uitgesloten, want het is te traag!

ik zoek dus eigenlijk een methode in MySQL (of eventueel andere Database, die onder Linux draait en snel is) waarmee ik dus twee extra dingen kan:
- zoeken op wildcards en
- zoeken naar foutgespelde (dus b.v. 'tommorrow') woorden..

iemand een idee en/of ervaring met deze dingen?

Verwijderd

Op donderdag 04 april 2002 20:38 schreef ddofborg het volgende:
Zoeken met
code:
1
SELECT * FROM Movies WHERE title LIKE 'jame%';

is uitgesloten, want het is te traag!
Waarom is dat te traag? Hoe heb je je indexen staan? Die kunnen queries zeer veel versnellen.

Ga je IMDB (www.imdb.com) nabouwen? :?

  • ddofborg
  • Registratie: Augustus 2000
  • Laatst online: 26-02 09:52
Waarom is dat te traag? Hoe heb je je indexen staan? Die kunnen queries zeer veel versnellen.
kolom TITLE is geindexeerd op 'fulltext'


Ga je IMDB (www.imdb.com) nabouwen? :?

ja, zoiets, maar dan beter :)

als ik op "... title LIKE '%bla%';" duurt het ongeveer 1000 keer zo traag... en dat kan ik niet maken voor de users...

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 08-09 20:35

CyberSnooP

^^^^ schrijft --->

Je kunt met soundex achtige methodes een eigen index opbouwen, eventueel in een aparte tabel.

Er zijn verschillende algortimen waarmee je een woord in een abstracte notatie kunt weergeven die voor zowel het goed als het foutgespelde woord gelijk is. Door dat algoritme toe te passen op zowel alle titels als op de ingevoerde zoekterm kun je overeenkomsten zoeken.

Een eigen index zie ik voor me als tabel met 2 kolommen als
soundex_woord en film_id.

[edit]Linkje, en kijk vooral ook bij de See Also woorden of in de MySQL manual voor gelijksoortige functies die misschien wel beter zijn.

|_____vakje______|


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Mischien is het handig om zelf een soort zoek structuur te implementeren. Hiervoor maak je een tabel met woorden en een koppeltabel met daarin woordid en filmid. Je hebt nu een iets simpelere tabel waar je je woorden uit kunt halen. Hier kun je vervolgens met levenstein of soundex werken.

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


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17

Skinny

DIRECT!

Misschien kun je hier wat ideeen opdoen ? Dit kwam ik zelf tegen pas geleden :

http://www.mnogosearch.org/
http://www.cogsci.princeton.edu/~wn/

SIZE does matter.
"You're go at throttle up!"


  • ddofborg
  • Registratie: Augustus 2000
  • Laatst online: 26-02 09:52
'soundex' methode (van MySQL) werkt opzich goed (ik heb het een tijdje geleden geprobeerd...

ik heb een kolom en in die kolom staat de titel van de film in 'gesoundex', dus "tomorrow never" = "T560 N160"...

maar als je zoekt naar "tomo*", dan klopt 'T560' niet meer, alleen het begin... en met MATCH() functie van MySQL kan ik geen wildcards gebruiken... alleen in versie 4 van MySQL, dus ik zoek nu ff wat anders...


ik ga nu of morgen ff die links doornemen...

PS: die functie moet naar mijn idee in de database zitten , want anders kun je niet zoeken...


bedankt!
Pagina: 1