Entwickler-Ecke

Datenbanken - Suchen per SQL mit SEHR ungenauen Ergebnissen


kiwicht - Mi 26.02.03 12:34
Titel: Suchen per SQL mit SEHR ungenauen Ergebnissen
Hallöchen...

folgendes Prob:

2 Datenbanken von Artikeln, die Größe der Datenbanken unterscheidet sich, aber die ArtikelNummern sind größtenteils gleich. Die Texte unterscheiden sich "geringfügig".

Nun will ich per KnopfDruck realisieren, das anhand der ArtikelBezeichnung der ersten DB ÄHNLICHE artikel aus der zweiten DB angezeigt werden.

Also:
In DB-1 folgender Artikel: kugelschreiber blau 15 cm mit Clip
In DB-2 sollen als Ergebnis-Menge ALLE kugelschreiber angezeigt werden.

Mein Gefühl sagt mir, das ist unmöglich..... ich hoffe ihr müsst mich darin nicht bestätigen... ;)

mfg
kiwicht


hansa - Mi 26.02.03 12:42

dein Gefühl ist trügerisch :lol: :

Quelltext
1:
SELECT * FROM ARTIKEL WHERE UPPER (BEZ) LIKE UPPER ('%kugelschreiber%')                    


Das würde folgendes finden :

adaswasAAKUGELSCHREIBERasdxyxyyx
guhhj n kugelSCHREIBER asfasdasdaa

aber nicht "kugelschriber"


kiwicht - Mi 26.02.03 12:49

ja, danke, aber die "Prozente" sind mir auch schon in den Sinn gekommen, bringt mich aber, wie du schon richtig festgestellt hast, nicht weiter, weil wenn ich in DB-1 folgenden Artikel habe:

"kugelschreiber blau 15 cm ohne Clip"

ergibt das im SQL-String folgende Suche:

"%kugelschreiber blau 15 cm ohne Clip%"

und würde also Ergebnis nur folgende zurückliefern:

"Kugelschreiber blau 15 cm ohne Clip mit Werbeaufdruck Sonderposten"

und das wäre leider nicht mein Ziel.... ich dachte vielleicht daran, meinen Suchstring auf das längste zusammenhängende Wort zu untersuchen, und dieses Automatisch als Suchstring mit "Prozenten" zu nutzen, aber ob´s das ist... :? :shock:


mfg

ps: vergas ich vielleicht zur erwähnen: der kugelschreiber und sämtliche extra-angaben wie farbe und länge befinden sich in EINEM feld, das macht die sache ja so kniffelig... sonst wärs ja kein problem... ;)


LCS - Mi 26.02.03 13:12

Hi
mit SQL alleine wirst du das in dem Fall nicht so einfach hinkriegen. Man könnte die Tabellen jeweils um eine Spalte ergänzen in der ein phonetischer Wert der Artikelbeschreibung (SoundEx) festgehalten wird und anhand dieser Codes die Artikel suchen.

Gruss Lothar


hansa - Mi 26.02.03 13:14

Warum einfach wenns auch kompliziert geht ? :mrgreen:


Quelltext
1:
SELECT * FROM ARTIKEL WHERE UPPER (BEZ) LIKE UPPER (''%' + Edit1.Text + '%'')                    


Warum willst Du denn das längste Wort suchen :?: Je länger, um so mehr Tipppppfehler. Bei meinem Beispiel würde auch das hier gefunden : "schreiber blau"


mars - Mi 26.02.03 13:15

schon wieder...ich tippe einfach zu langsam...


LCS - Mi 26.02.03 13:17

hansa hat folgendes geschrieben:
Warum willst Du denn das längste Wort suchen :?: Je länger, um so mehr Tipppppfehler. Bei meinem Beispiel würde auch das hier gefunden : "schreiber blau"


Ich bin bei meinem Vorschlag mal davon ausgegangen dass er das nicht erst eingeben will. Deshalb die phonetischen Codes.

Gruss Lothar


hansa - Mi 26.02.03 13:51

Jo, LIKE mit % und Soundex, sonst gibts wohl nichts. Kiwicht muß sich da halt was mit zusammenbasteln.


kiwicht - Mi 26.02.03 14:13

Zitat:
mit SQL alleine wirst du das in dem Fall nicht so einfach hinkriegen. Man könnte die Tabellen jeweils um eine Spalte ergänzen in der ein phonetischer Wert der Artikelbeschreibung (SoundEx) festgehalten wird und anhand dieser Codes die Artikel suchen.


Also extra Spalte fällt leider aus diversen Gründen erstmal raus, wäre sicherlich die Beste Lösung... Und was hat das mit SoundEx aufsich? Mir ist dieser Begriff irgendwo schoneinmal untergekommen...

Zitat:
Warum willst Du denn das längste Wort suchen Je länger, um so mehr Tipppppfehler. Bei meinem Beispiel würde auch das hier gefunden : "schreiber blau"


Bei mir läuft das ja anders ab, ich suche NICHT nach den User-Eingaben, sonder will praktisch "Quer-Verknüpfen", so wie LCS es eben auch gerade festgestellt hat.

Nochmal zu meinem Beispiel:
Ich hab eine Datenbank, die umfasst sämtliche MEINE artikel, die ich im Lager habe.
Ich hab eine zweite Datenbank, die umfasst sämtliche Artikel von Lieferanten, die ich irgendwann schon mal bestellt habe.
Wenn ich nun in meiner eigen Datenbank bin, und sehe: "Aha, Kugelschreiber sind alle!" Dann will ich auf einen Button drücken, der meine Lieferanten-Datenbank öffnet, und dort ALLE kugelschreiber anzeigt, von jedem Lieferanten, jeder Form und jeder Art!

Nun ist also die Frage:
Ist der Hauptsuchbegriff, also der primäre Bezeichner für meine Artikel, in meinem Datenbankfeld...

... immer der längste String?
... immer der erste String?
... immer der String ohne irgendwelche Zahlen oder Zeichen drinn?

Oder sollte ich folgendermaßen vorgehen:
Teile das Datenbank-Feld in 'n' Strings auf, jeder dieser Strings enthält einen zusammenhängenden String des Feldes. (rein technisch gesehen möglich)
Durchsuche die Datenbanke jetzt jeweils einmal nach diesen Strings, merke dir wie groß jeweils die ErgebnissMenge war, und gehe davon aus, das der Suchstring, der die KLEINSTE ErgebnissMenge zurückgeliefert hat, der richtige respektive hier relevante Suchstring ist.

Also:
Mein Feld in der DB enthält: "kugelschreiber blau 15cm ohne Clip"
Diese Feld verteile ich auf 5 Strings:
1: kugelschreiber
2: blau
3: 15cm
4: ohne
5: clip

Jetzt filtere ich die DB nach 1, 2, 3 usw. und merke mir per RecordCount jeweils die zurückgeliefert Größe.
Es ist leicht zu erkennen, welcher String am wenigsten Werte zurückliefert, und zwar 1, gefolgt warscheinlich von 5 und dann der rest.
In diesem Fall dürfte diese Methode warscheinlich zum Erfolg führen, wennoch sie sehr langsam in der Ausführung wäre, möcht ich meinen...

was meint ihr dazu?


PS: kann nochmal einer das mit dem SoundX näher erläutern, oder einen AnhaltsPunkt geben, wonach ich googeln oder in der Delphi-Hilfe suchen kann?


hansa - Mi 26.02.03 14:20

Kriege nicht genau gepeilt, was Du da genau willst. Aber noch zu SoundEx : Stelle Dir vor, Du hättest in der DB einen Meyer, einen Maier und einen Meier. Hört sich ziemlich gleich an, obwohl es immer anders geschrieben wird, oder? Der Soundex-Wert dieser drei Namen wäre in diesem Fall der gleiche. Das soll jetzt keine Definition sein :!: Es geht nur um das ungefähre Prinzip.


Klabautermann - Mi 26.02.03 14:38

Hallo,
hansa hat folgendes geschrieben:
aber nicht "kugelschriber"

hier lässt sich ein Trick anwenden der in ähnlicher Form gerne für die Telefonnummernsuche verwendet wird. Man setzt einfach ein % Zeichen an jede zweite stelle des Suchwortes. Dann werden auch vergessene Buchstaben tolleriert (Bei Telefonnummern filtert man die reinen Nummern aus dem Suchstring und macht es dann).

Die folgende funktion würde so einen String liefern:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function GetSearchString(aSerchString : STRING) : STRIN;
  VAR
    i : LongInt;
BEGIN
  Result := '';
  FOR i := 1 TO length(aSearchString) DO
    Result := Result + '%' + aSearchString[i];
  Result := Result + '%';
END;


Gruß
Klabautermann


kiwicht - Mi 26.02.03 14:39

Zitat:
Kriege nicht genau gepeilt, was Du da genau willst


8) :D .. was genau? Meine Lösungsansätze? Zugegeben, etwas konfus... :?

Aufjedenfall hört sich das mit dem SoundEx schonmal sehr vielversprechend an, ich les mich mal schlau...thx


LCS - Mi 26.02.03 18:02

Hi
kiwicht hat folgendes geschrieben:
Aufjedenfall hört sich das mit dem SoundEx schonmal sehr vielversprechend an, ich les mich mal schlau...thx

Hab ich zum ersten Mal bei DBase III (RiP) kennengelernt. Seit Delphi 6 stehen auch hier entsprechende Funktionen zur Verfügung.

Klabautermann hat folgendes geschrieben:

Man setzt einfach ein % Zeichen an jede zweite stelle des Suchwortes. Dann werden auch vergessene Buchstaben tolleriert.

Coole Idee. Frag ich mich glatt, warum ich da noch nie selber draufgekommen bin :roll: Werd ich mir auf jeden Fall merken.

Gruss Lothar


kiwicht - Mi 26.02.03 20:42

LCS hat folgendes geschrieben:
Werd ich mir auf jeden Fall merken.

Gruss Lothar


jup, hab ich auch gerade erst gesehen, was es nicht alles gibt. und abheften.. ;)