Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3458[/thread]

"unscharfe" Suche in DB



<< >> 9 Einträge, 1 Seite
Gast Gast
 2004-05-25 10:42
#32174 #32174
Hallo zusammen,

ich stehe vor der Aufgabe die Daten einer übers Web ansprechbaren DB mit einer lokalen DB zu vergleichen. Mein Problem ist, dass ich die Daten aus der WebDB nur in Form einer HTML-Liste erhalten kann. Jeder Listenpunkt enthält einen Datensatz, die Attribute sind durch Kommas voneinander getrennt. Leider sind aber auch innerhalb der Attributwerte manchmal Kommas vorhanden. Ich kann also leider nicht automatisiert die Attribute aufspalten und bspw. in einer lokalen DB zwischenspeichern.

Ich hab mir also jetzt gedacht, dass ich einfach den "String" der in jedem Listenpunkt vorhanden ist, so wie er ist in eine DB (als ein einziges Attribut) oder ein File schreibe und dann sowas wie ne "unscharfe Suche" mit den "sauberen Daten" aus meiner lokalen DB auf diesen Strings ausführe.

Ist das verständlich ausgedrückt :-)?

Was haltet ihr von der Idee? Und viel wichtiger: Wie setze ich das am Besten (natürlich in Perl) um?


Was ich mich in diesem Zusammenhang auch schon gefragt habe: Wie funktioniert bspw. die Suche von Amazon.de? Wenn ich da kunterbunt gemischt den Titel und Autor eines Buches eingebe findet der das richtige Buch. Gibts irgendwelche Literatur die sich mit derartigen "Suchmaschienen" beschätigt?


Danke schonmal für Eure Antworten


tobias
pktm
 2004-05-25 11:55
#32175 #32175
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Nehmen wir an du hast eine DB mit den Feldern Id (unique), a und b.
Dann möchtest du nach dem Listenfeld Id suchen um die einzelnen Datensätze zu finden und aufzusplitten und alles was zwischen 2 Id's zweirer Datensätze steht (also den Datensatz) unscharf durchsuchen?
Dafür kannst du das Modul HTML::Parser verwenden (läuft gerade ien netter Thread hier) bzw. wenn du die Datensätze in Form von
Id => Datensatz_aneinandergehängt(da ja Komma als Separatoren wegfallen) in eine DB schreibst kannst du die DB mit "LIKE" durchsuchen.
Mehr dazu (was ich meine :) ) hier:
http://www.mysql.de/documen....nctions

Hoffe, dass du damit was anfangen kannst.
Nützlich wäre es, wenn du ein bischen was von deiner Datenbank posten würdest.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
tobiAS
 2004-05-25 12:33
#32176 #32176
User since
2004-05-25
3 Artikel
BenutzerIn
[default_avatar]
Den genauen Aufbau der DB kenn ich leider auch nicht. Prinzipiell gehts aber um ne Adress-DB. Ich hab also in der relevanten Tabelle einen künstlichen Schlüssel und die üblichen Address-Felder (Firma, Name, Vorname, PLZ, etc.).
Aus der WebDB bekomme ich dann in jedem <ul></ul>-TAG-Paar einen String mit mehr oder weniger vielen Address-Informationen. Mal nur Nachname, Wohnort; mal Firma, Name, Vorname, Strasse, PLZ, Wohnort etc.

Meine Idee ist, wie Du es auch geschrieben hast, dann diese Strings in ein Feld einer MySQL-DB zu schreiben und anschliessend jeden Datensatz aus meiner Address-Tabelle mit dem LIKE oder REGEXP (ich weiss noch nicht so genau welcher Operator was kann) Operator gegen die MySQL-DB zu testen.

Ich frag mich halt nur, ob das die effizienteste Möglichkeit ist und wie hoch wohl die Fehlerquote ist.

Da ich immer min. Ort und Name aus der Web-DB bekomme müsste ja was in der Art von ...where "name" like webdbfeld AND "ort" like webdbfeld halbwegs ordentliche Ergebnisse produzieren.

Allerdings können da u.U. auch sehr viele Falschmeldungen raus entstehen, wenn es viele Addressdaten mit gleichem Name und gleicher Stadt gibt.
pktm
 2004-05-25 13:29
#32177 #32177
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Da würd eich dir dann direkt die RegEx empfeheln und den Umweg über die Datenbank lassen.
Was immer zwischen den li-Tags steht kannst du mit HTML::TokeParser rausfinden, siehe dazu das Teham hier: http://board.perl-community.de/cgi-bin....0;#idx2
http://www.intergastro-service.de (mein erstes CMS :) )
tobiAS
 2004-05-25 14:28
#32178 #32178
User since
2004-05-25
3 Artikel
BenutzerIn
[default_avatar]
Da sich die WebDB quasi täglich ändert, muss ich die Abfragen der WebDB auf jeden Fall irgendwo permanent speichern, damit ich die bereits erfassten Ergebnisse nicht doppelt gegen meine lokale DB teste.

Falls ich schreibenden Zugriff auf die lokale DB bekomme (schätze ist ne Oracle), werde ich die Ergebnisse dorthinein schreiben.

Hat Oracle LIKE und REGEXP Operatoren?

Falls ich das nicht über DB mache:
Wie teste ich über Rgex denn, ob zwei (oder mehr) bestimmte Substrings in dem zu untersuchenden String vorkommen? Ich kenne wohl den | für "oder" aber wie geht denn "und"? Werd ich wohl mal das Camel-Buch zu Rate ziehen :-)


tobias
pktm
 2004-05-25 16:16
#32179 #32179
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
ILKE und REGEXP sind SQL-Anweisungen, die sollten eigentlich auf allen Datenbanken laufen.
Kenne mich mit Oracle aber nicht aus, damusst du die Dok welzen.

[s]Zu den Regex: meins du Perl-Regex oder SQL-Regex?[/s]
Camel-Buch = perl :)
muss suchen...\n\n

<!--EDIT|pktm|1085487434-->
http://www.intergastro-service.de (mein erstes CMS :) )
pktm
 2004-05-25 16:18
#32180 #32180
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Eventuell mit
if( $string =~ /$patterna/ or $string $=/patternb ){
print "gefunden";
}
Wie das intern in der Regex geht kann ich dir von hier aus (Arbeit) leider nicht sagen...
brauche mein Buch dafür :)
http://www.intergastro-service.de (mein erstes CMS :) )
tobiAS
 2004-05-25 17:48
#32181 #32181
User since
2004-05-25
3 Artikel
BenutzerIn
[default_avatar]
Aus dem Kochbuch Rezept 6.18 (bzw. 6.17 der ersten Auflage):

True if either /ALPHA/ or /BETA/ matches, like /ALPHA/ || /BETA/:

/ALPHA|BETA/

True if both /ALPHA/ and /BETA/ match, but may overlap, meaning "BETALPHA" should be okay, like /ALPHA/ && /BETA/:

/^(?=.*ALPHA)(?=.*BETA)/s

True if both /ALPHA/ and /BETA/ match, but may not overlap, meaning that "BETALPHA" should fail:

/ALPHA.*BETA|BETA.*ALPHA/s

True if pattern /PAT/ does not match, like $var !~ /PAT/:

/^(?:(?!PAT).)*$/s

True if pattern BAD does not match, but pattern GOOD does:

/(?=^(?:(?!BAD).)*$)GOOD/s\n\n

<!--EDIT|tobiAS|1085493024-->
Taulmarill
 2004-05-25 18:12
#32182 #32182
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
@tobias: LIKE is SQL standart (irgend einer von den vielen) und wird von oracle unterstützt.
bei REGEXP sieht das schon anders aus. normalerweise sollte oracle das können. muss aber anscheinend explizit bei der installation mitinstalliert werden.
hab hier auch zwei oracle DBs (bin aber nich der admin) wo das leider nicht funktioniert. keine ahnung warum :(
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< >> 9 Einträge, 1 Seite



View all threads created 2004-05-25 10:42.