Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Volltextsuche (https://www.delphipraxis.net/163535-volltextsuche.html)

patti 3. Okt 2011 18:01

AW: Volltextsuche
 
Hab gerade eben mal einen Suchbaum geschrieben (allerdings in Java) und hinsichtlich der Geschwindigkeit mit der TWoerterbuch-Klasse von DeddyH verglichen. Hab das ganze mal mit dem deutschen Ubuntu-Wörterbuch getestet (über 300.000 Wörter) und beispielhaft nach dem Präfix "Katze" gesucht (53 Treffer!). Das ganze hab ich auf einem Netbook laufen lassen (Single-Core, 1,7 GHz). Die Lösung von DeddyH benötigt bei mir im Schnitt etwa 80 ms, meine Suchbaum-Implementierung 2-3 ms. Wenn es also nicht auf extreme Geschwindigkeit ankommt oder der Umfang des Wörterbuchs gering ist, dann ist die Lösung von DeddyH auf jeden Fall voll in Ordnung (vor allem, weil sie einfacher zu implementieren und zu verstehen ist) :thumb: Allerdings ließe sich durch eine etwas komplexere Implementierung als Suchbaum doch noch einiges an Geschwindigkeit rausholen ;)

Nur so als Info, denn das hier:

Zitat:

Zitat von DeddyH
Das finde ich für einen Anfänger allerdings reichlich übertrieben.

stimmt natürlich auch wieder ;) Hatte aber eben gerade Lust dazu, so ein Teil zu schreiben ;)

DeddyH 3. Okt 2011 18:05

AW: Volltextsuche
 
Ja sicher, meine Lösung ist ja auch mehr auf Verständlichkeit (obwohl das für den absoluten Anfänger wohl auch schon hard stuff ist) als auf Performance ausgelegt. Wenn Du magst, kannst Du ja trotzdem einmal Deine Variante posten, ich denke, daran bin nicht nur ich interessiert (wer weiß, ob man das nicht mal brauchen kann?) ;)

patti 3. Okt 2011 18:13

AW: Volltextsuche
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DeddyH (Beitrag 1128154)
Wenn Du magst, kannst Du ja trotzdem einmal Deine Variante posten

Ist halt wie gesagt in Java, weil (1) Lazarus im Moment nicht so mag wie ich und (2) ich demnächst selber mal sowas in Java brauchen werde... Ist auch kein bisschen kommentiert und sicherlich auch noch nicht perfekt, ist mehr oder weniger schnell runtergetippt... Löschen aus dem Suchbaum fehlt auch noch. Ich hänge es trotzdem mal an, wenn jemand Interesse daran hat ;)

lg

DeddyH 3. Okt 2011 18:24

AW: Volltextsuche
 
*Puh* das muss ich mir mal ganz in Ruhe anschauen, obwohl ich arg bezweifle, dass meine Java-Grundkenntnisse von 2004 da noch ausreichen.

patti 3. Okt 2011 18:30

AW: Volltextsuche
 
Hm, vielleicht kommentiere ich das Teil auch mal ordentlich, dann sollte es relativ einleuchtend sein ;)

BUG 3. Okt 2011 18:42

AW: Volltextsuche
 
Ich hab das Teil afaik als Trie-Struktur beigebracht bekommen.
Wir durften eine Art T9 damit basteln :mrgreen:

himitsu 3. Okt 2011 18:50

AW: Volltextsuche
 
Delphi-Quellcode:
uses DB, DBClient, MidasLib; // unit MidasLib, damit man diese blöde Midas.dll nicht mitgeben muß

type
  TWoerterbuch = class(TClientDataSet)
    constructor Create;
    procedure Add(const Word: string);
    function Filter(const SearchWord: string): Boolean;
    procedure Delete(const Word: string);
    procedure Clear;
    procedure GetList(Result: TStrings);

    //property FileName: string; // ist alles in TClientDataSet deklariert
    //procedure LoadFromFile(const FileName: string = '');
    //procedure SaveToFile(const FileName: string = ''; Format: TDataPacketFormat = dfBinary);
    //procedure LoadFromStream(Stream: TStream);
    //procedure SaveToStream(Stream: TStream; Format: TDataPacketFormat = dfBinary);
  end;

procedure TWoerterbuch.Add(const Word: string);
begin
  Insert;
  try
    Self['Word'] := Word;
    Post;
  except
    Cancel;
    raise;
  end;
end;

procedure TWoerterbuch.Clear;
begin
  EmptyDataSet;
end;

constructor TWoerterbuch.Create;
begin
  CreateDataSet;
  FieldDefs.Add('Word', {$IF SizeOf(Char) = 2}ftWideString{$ELSE}ftString{$IFEND}, 30);
  AddIndex('WordIdx', 'Word', [ixUnique, ixCaseInsensitive]);
  IndexName := 'WordIdx';
end;

procedure TWoerterbuch.Delete(const Word: string);
begin
  if Locate('Word', Word, [loCaseInsensitive]) then
    inherited Delete;
end;

function TWoerterbuch.Filter(const SearchWord: string): Boolean;
begin
  if SearchWord <> '' then begin
    Filtered := False;
    FilterOptions := [foCaseInsensitive, foNoPartialCompare];
    Filter := '[Word] LIKE ''' + SearchWord + '%''';
    Filtered := True;
  end else
    Filtered := False;
  Result := RecordCount > 0;
end;

procedure TWoerterbuch.GetList(Result: TStrings);
begin
  Result.BeginUpdate;
  try
    First;
    while not Eof do begin
      Result.Add(Self['Word']);
      Next;
    end;
  finally
    Result.EndUpdate;
  end;
end;
(hoffentlich hab ich das jetzt richtig zusammenbekommen)

Oder direkt an eine datenbank ran, aber dann ohne CreateDataSet (im Constructor) und ohne SaveToFile und LoadFromFile.

Statt GetList kann man es auch direkt, über eine TDataSource, an einen DBGrid hängen.
Oder man nimmt die TDataSource als Vorfahre und das TClientDataSet in die Klasse rein.

patti 3. Okt 2011 18:51

AW: Volltextsuche
 
Also den Namen Trie kannte ich bisher nicht (finde ich ehrlich gesagt auch etwas "gewöhnungsbefürftig"), aber das Prinzip ist genau das Gleiche ;) Das Beispiel mit dem T9 klingt interessant, da mach ich mir mal Gedanken dazu ;)

DeddyH 3. Okt 2011 18:54

AW: Volltextsuche
 
Zu #27: Jetzt noch eine Client-/Server-Datenbank mit MySQL auf einem Webserver mit Abfragen über HTTPS, und wir haben auch den letzten Anfänger vergrault. Geht es hier eigentlich um Hilfe oder darum, wie man sich selbst am Besten darstellt? *Koppschüttel*

patti 3. Okt 2011 19:00

AW: Volltextsuche
 
Ehrlich gesagt finde ich den "Informationsaustausch" voll in Ordnung. Es geht darum, mögliche Lösungswege aufzuzeigen - darum geht es ja schließlich in einem Forum. Der TE hat ziemlich schnell eine funktionierende und relativ leicht verständliche Lösung bekommen, also kann der schonmal glücklich sein. Der Rest braucht ihn ja nicht zu interessieren, aber für andere User ist das hier evtl. durchaus interessant.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz