[php] aanpak (fuzzy) search database teksten

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

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik zit over het volgende na te denken:

Ik heb een website waarbij nu hier en daar door een bepaalde database tabel gezocht kan worden. Het gaat dan om LIKE '%$zoek%' in de query.

Ik wil nu echter een algemene zoekfunctie voor meer tabellen in 1 keer. Verder wil ik gebruik maken van een zogenoemde 'fuzzysearch'. Het gaat in de database om soms best grote lappen tekst (nieuwsberichten, forumberichten, faq, handleiding) en er zijn op dit moment in totaal zo'n 1000 records.

Voor de fuzzysearch wilde ik
code:
1
int similar_text ( string first, string second [, float &percent] )

gaan gebruiken en boven een bepaald percentage het zoekresultaat weergeven.

Je kunt echter op je vingers natellen dat als je eerst alle data uit de database haalt en vervolgens hieruit alle kernwoorden haalt (filter lidwoorden etc.) en dan per woord een similar_text check doet de server hier te lang mee bezig is.

Een andere mogelijkheid is het aanmaken van een steekwoorden tabel die bijhoud welke woorden in welke tabellen staan onder welke id's. Maar dit is natuurlijk best bewerkelijk. Helemaal omdat ik dan op verschillende plaatsen op de site en in de admin moet gaan inbouwen dat de steekwoorden tabel wordt geupdate bij een post. Hierdoor ben ik niet zo happig om dit helemaal te gaan opzetten.

Heeft iemand hier ervaring mee of ideeen over die hij/zij met me zou willen delen?
Is er een andere en of betere aanpak?

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Kijk eens naar Mysql's Match Against met de fulltext indexen ;)
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

[ Voor 36% gewijzigd door frickY op 07-02-2006 08:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
He dank je wel, dit lijkt me een nuttige insteek.

Zo op het eerste gezicht dien ik geloof ik wel de 'search' tabellen opnieuw aan te maken.

Op de server draait mysql 4.1.1 dus ik geloof dat ik eindelijk eens geluk heb omdat deze Full-Text al ondersteunt.

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 19-09 22:18

chem

Reist de wereld rond

Verwijderd schreef op dinsdag 07 februari 2006 @ 09:35:
He dank je wel, dit lijkt me een nuttige insteek.

Zo op het eerste gezicht dien ik geloof ik wel de 'search' tabellen opnieuw aan te maken.

Op de server draait mysql 4.1.1 dus ik geloof dat ik eindelijk eens geluk heb omdat deze Full-Text al ondersteunt.
Nee, de kolom waar je data in staat geef je een fulltext index mee, that's it. Je hebt geen "hulptabellen" oid nodig.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
met mysql full-text search kun je inderdaad de relevantie ophalen (Relevance is computed based on the number of words in the row, the number of unique words in that row, the total number of words in the collection, and the number of documents (rows) that contain a particular word.)

Maar je kunt alleen zoeken op een exacte match. Zelfs als je zoekt op een deel van een woord dat voorkomt in de database krijg je geen match. Dat maakt het dus eigenlijk minder handig dan LIKE %%. Maar ik wil juist nog een stap verder ==> fuzzy search, type,-spelfout correctie. Hoe moet dat dan worden bereikt met deze techniek?

Of zie ik iets over het hoofd?

Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik denk dat levenshtein is wat je zoekt. :)

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
levenshtein of similar_text dat maakt me in dit stadium nog niet uit. Het komt erop neer dat je 2 strings met elkaar wilt vergelijken. Als de match ($lev) voldoende groot is wordt deze toegevoegd aan de zoekresultaten.


code:
1
$lev = levenshtein($zoekstring,$databasestring);


Maar hoe kun je voorkomen dat alle woorden uit alle gewenste velden uit alle records uit alle gewenste tabellen moeten worden opgehaald en gematcht met levenshtein of similar_text. Dat kost toch veel teveel tijd.
Pagina: 1