Suche in großen Datenbeständen
Moderator: Moderatoren
Re: Suche in großen Datenbeständen
Nochmal zur Fulltext-Suche.
Wir hatten das mal in der XUG-Zürich behandelt, und es geht mit den Low Level Funktionen relativ zügig.
Und zwar ist es direkt damit (zB. FRead() ) schneller als in dem Beispiel von Alaska.
Aber wie es ganz genau geht, kann ich nicht mehr sagen, da müsste man ausprobieren.
Vermutlich jeweils die ganzen Sätze als String durchsuchen.
Ich nehme aber "Pi mal Handgelenk " mal an, dass es sich erst lohnt, wenn Du mehr als 2 Felder durchsuchen musst ...
Wir hatten das mal in der XUG-Zürich behandelt, und es geht mit den Low Level Funktionen relativ zügig.
Und zwar ist es direkt damit (zB. FRead() ) schneller als in dem Beispiel von Alaska.
Aber wie es ganz genau geht, kann ich nicht mehr sagen, da müsste man ausprobieren.
Vermutlich jeweils die ganzen Sätze als String durchsuchen.
Ich nehme aber "Pi mal Handgelenk " mal an, dass es sich erst lohnt, wenn Du mehr als 2 Felder durchsuchen musst ...
Zuletzt geändert von Daniel am Fr, 09. Nov 2012 9:47, insgesamt 1-mal geändert.
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Suche in großen Datenbeständen
Leider nein, zwecks Kompatibilität mit alter DOS-Version und vieler anderer alter Programme, die auf die Daten zugreifen.brandelh hat geschrieben:Wenn du CDX nehmen kannst
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Suche in großen Datenbeständen
verrückte Idee ... SOUNDEX ?Werner_Bayern hat geschrieben:... also auch "STROM" in "ABB Stotz Fehlerstromschutzschalter".
...
Ein $ - Scope wäre super.
ich suche ja nach Ziffern die Teil eine Tel / Handy / Fax / Kto etc sein könnten.
unter PostgreSQL hab ich letztens in was über "Fulltextsearch" mit SOUNDEX gelesen ... mit "Index" ...
es geht da um Levenshtein / Metaphone / Double Metaphone sowie hstore
bei den ersten 3 handelt es sich wohl um Algorithmen während hstore noch "Operators and Functions" hat.
und dann gibt es noch GIST / GIN
wenn man also einen IndexIndexes
hstore has GiST and GIN index support
Code: Alles auswählen
INDEX ON SOUNDEX(Text1+Text2) ...
gruss by OHR
Jimmy
Jimmy
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Suche in großen Datenbeständen
Aus der Hilfe.Soundex() - Diese Funktion wird von Xbase++ nicht unterstützt
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Suche in großen Datenbeständen
YUP ... deshalb hab ich ja auch die 3 Algorithmen (Levenshtein / Metaphone / Double Metaphone) zitiert.Werner_Bayern hat geschrieben:Aus der Hilfe.Soundex() - Diese Funktion wird von Xbase++ nicht unterstützt
im Grunde könnte man "alten" Cl*pper "C" Code nehmen ... ot4xb ... und das ganze "Deutsch" anpassen ...
es geht ja hier nur um die Idee einer Function, im IndexKey(), aus "Buchstaben" etwas anderes zu machen um es dann per SCOPE einzugrenzen.
wenn man wirklich "Fulltext Search" haben will müsste man, wie bei PostgreSQL v9.x wohl möglich, einen "Index" für "jedes Wort" erstellen.
gruss by OHR
Jimmy
Jimmy
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Suche in großen Datenbeständen
Servus Jimmy,
danke. Der Aufwand ist mir zu groß, diesen Monat, spätestens im Dezember soll ja eh endlich die "public CTP 3" kommen. Dann wird umgestellt auf SQL.
danke. Der Aufwand ist mir zu groß, diesen Monat, spätestens im Dezember soll ja eh endlich die "public CTP 3" kommen. Dann wird umgestellt auf SQL.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
Ich habe unsere neue Prof Sub zähneknirschend bestellt
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Suche in großen Datenbeständen
Ich bereits 2x (Standard), ohne irgendein Update zu bekommen.brandelh hat geschrieben:Ich habe unsere neue Prof Sub zähneknirschend bestellt
Das SR1 war beim Xbase++ Neukauf Ende 2009 bereits dabei, seither gab es nichts, nur 1 (!) Fehlerbereinigung.
Aber das Thema wurde ja schon mehr als ... besprochen.
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Suche in großen Datenbeständen
c:\ALASKA\XPPW32\Source\samples\basics\CAPI\soundex.objWerner_Bayern hat geschrieben:danke. Der Aufwand ist mir zu groß,
"wer" sagt das ???Werner_Bayern hat geschrieben:diesen Monat, spätestens im Dezember soll ja eh endlich die "public CTP 3" kommen.
JA ... das werden dann (hoffentlich) einige tun.Werner_Bayern hat geschrieben:Dann wird umgestellt auf SQL.
gruss by OHR
Jimmy
Jimmy
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Suche in großen Datenbeständen
Alaska in einer Mail an mich.AUGE_OHR hat geschrieben:"wer" sagt das ???
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Suche in großen Datenbeständen
... als Weihnachts-Geschenk über das man sich ärgern darf ...Werner_Bayern hat geschrieben:Alaska in einer Mail an mich.
gruss by OHR
Jimmy
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
Arctica hin oder her - man sollte nicht meinen, dass eine willkürliche Instring-Suche mit einem SQL-Server automatisch rasendschnell wird. Die Anbieter, die beispielsweise im Web etwas Derartiges ermöglichen, tricksen auch. So wird das Amazon-Sortiment verschlagwortet, damit die Suche in den Millionen Artikeln halbwegs brauchbare Antwortzeiten liefert, und Google ergänzt derlei um parallel suchende Maschinen. Wenn man bei Amazon irgendeinen Artikel sucht und findet, der "rechteckig" ist (etwa eine Vase oder so), und man sucht anschließend mit einer ähnlichen Abfrage, aber ohne den Präfix "recht" (also nur "eckig"), findet man nicht die selben Artikel. Denn auch mit High-End-Servern und optimierten Statements scheitert eine solche Volltextsuche am gewaltigen Datenbestand. Dies nur als Hinweis. Man kann mit Leistung nicht alles erschlagen.
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Suche in großen Datenbeständen
was praktisch ein "Index" ist.Tom hat geschrieben:verschlagwortet
wenn ich das "richtig" verstehe nennt man das bei PostgreSQL einen GIN Index wie er z.b. für eine Dokumenten Verwaltung zur "Volltextsuche" benutzt wird.
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
Im Prinzip könnte man einen Custom Index so anlegen (wenn ich es recht verstanden habe).
Suchbegriff mit $ im cFeld1+cFeld2+cFeld3 ... suchen.
Wenn vorhanden, diesen Satz mit dem Indexbegriff aufnehmen ...
Mit jedem Suchbegriff müsste man diesen kompletten Lauf machen, was natürlich erhebliche Zeit kostet,
aber einmal erledigt, wäre die Suche nach einem Schlüsselwort sehr schnell.
Beim Speichern sollte man natürlich genauso prüfen, ob eines der Schlüsselwörter vorhanden ist UND man müsste prüfen ob eines rausgeflogen ist.
Nicht ganz einfach, aber wenn man es braucht und die Anzahl der Schlüsselwörter begrenzt bleibt ...
Suchbegriff mit $ im cFeld1+cFeld2+cFeld3 ... suchen.
Wenn vorhanden, diesen Satz mit dem Indexbegriff aufnehmen ...
Mit jedem Suchbegriff müsste man diesen kompletten Lauf machen, was natürlich erhebliche Zeit kostet,
aber einmal erledigt, wäre die Suche nach einem Schlüsselwort sehr schnell.
Beim Speichern sollte man natürlich genauso prüfen, ob eines der Schlüsselwörter vorhanden ist UND man müsste prüfen ob eines rausgeflogen ist.
Nicht ganz einfach, aber wenn man es braucht und die Anzahl der Schlüsselwörter begrenzt bleibt ...
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: Suche in großen Datenbeständen
ist in deinem Beispiel cFeld = 1 Wort ?brandelh hat geschrieben:Im Prinzip könnte man einen Custom Index so anlegen (wenn ich es recht verstanden habe).
Suchbegriff mit $ im cFeld1+cFeld2+cFeld3 ... suchen.
Wenn vorhanden, diesen Satz mit dem Indexbegriff aufnehmen ...
nimm doch einfach ein Text Memo ( Dokument ) als Beispiel ... "alle" Wörter werden einzeln "indiziert"
nach welchem Algorithmus der Index später "ausgewertet" wird ist z.b. des "Geheimnis" von Google ...
Stichwort : SQL "Trigger"brandelh hat geschrieben:Beim Speichern sollte man natürlich genauso prüfen, ob eines der Schlüsselwörter vorhanden ist UND man müsste prüfen ob eines rausgeflogen ist...
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
ich meinte Feldnamen, die durchsucht werden sollen. Also so: field->Feld1+field->Feld2+field->Feld3AUGE_OHR hat geschrieben:cFeld1+cFeld2+cFeld3 ...
die "Trigger" gibt es ja unter DBF nicht.AUGE_OHR hat geschrieben:Stichwort : SQL "Trigger"brandelh hat geschrieben:Beim Speichern sollte man natürlich genauso prüfen, ob eines der Schlüsselwörter vorhanden ist UND man müsste prüfen ob eines rausgeflogen ist...
Ein SQL Server, der eine richtige Fulltextsuche unterstützt, wäre natürlich die bessere Alternative.
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2825
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 96 Mal
- Danksagung erhalten: 13 Mal
Re: Suche in großen Datenbeständen
Hallo,
die Überlegung, mehrere Felder in den Index zu nehmen, hat was für sich, aber auch was gegen sich: nämlich die Begrenzung des Index-Ausdrucks sowie des Wertes, der als Ergebnis des Ausdrucks kommt.
Wenn in einem Memo-Feld gesucht werden soll, gibt es erst recht Schwierigkeiten.
Dazu kommt, dass ein solcher Index auch verwaltet werden will ...
Je nach Hardware, Leitung, Datensatzgrösse etc. kann man ja theoretisch mehrere Threads laufen lassen, die parallel den Datenbestand durchgehen, und die Satznummern der übereinstimmenden Datensätze in einem Array ablegen, aus dem dann ein Browse incrementell angezeigt wird.
die Überlegung, mehrere Felder in den Index zu nehmen, hat was für sich, aber auch was gegen sich: nämlich die Begrenzung des Index-Ausdrucks sowie des Wertes, der als Ergebnis des Ausdrucks kommt.
Wenn in einem Memo-Feld gesucht werden soll, gibt es erst recht Schwierigkeiten.
Dazu kommt, dass ein solcher Index auch verwaltet werden will ...
Je nach Hardware, Leitung, Datensatzgrösse etc. kann man ja theoretisch mehrere Threads laufen lassen, die parallel den Datenbestand durchgehen, und die Satznummern der übereinstimmenden Datensätze in einem Array ablegen, aus dem dann ein Browse incrementell angezeigt wird.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
Man verschlagwortet und indexiert ja nicht, indem man zu jeder einzelnen Tabelle, die mögliche Schlagworte enthält, entsprechende Indexe und Felder aufbaut, sondern man führt solch einen Schlagwortindex sinnvollerweise getrennt. Der Trick besteht - wie so oft - darin, die Performanceschwierigkeiten auf Elemente zu verteilen, bei denen Performance irrelevant ist. Erfasst man beispielsweise einen Artikel mit einer umfangreichen Beschreibung, mag es zwei oder drei Sekunden kosten, den Schlagwortindex zu aktualisieren und anzupassen, aber der Benutzer kann und wird das hinnehmen. Im Ergebnis kann man dann aber eine sehr viel schnellere Schlagwortsuche zur Verfügung stellen, die über eine getrennte Schlagwortsammlung die dazugehörigen Artikel referenziert. Das ist natürlich, was die Programmlogik anbetrifft, deutlich aufwendiger als ein simples "SET FILTER TO cSuchBegriff $ artikelbeschreibung", aber der Benefit dieses Aufwands kann sehr groß sein.
Das ist ohnehin ein Prinzip, das man verinnerlichen sollte, das aber für viele von uns, die noch in Platz- und Zeitspareneopchen das Programmieren gelernt haben, schwer in die Köpfe zu bekommen ist. Ich habe beispielsweise eine Funktionalität, die in einer Tabellendarstellung gewaltige Datenmengen aus zig Tabellen aufbereitet. Das geschah bis vor kurzem zur Laufzeit; es sind also immer dieselben Daten aufbereitet worden, die sich allerdings auch laufend ändern konnten. Inzwischen habe ich diese Datenaufbereitung in jene Prozesse gezogen, die Daten ändern können, wodurch diese kaum spürbar verlangsamt wurden, aber die Darstellung der gesamten Datenmenge sehr, sehr rasant geworden ist. Hierfür waren zusätzliche Tabellen und Eingriffe an sehr vielen Stellen nötig. Das Ergebnis ist verblüffend, ohne dass die gesamte Systematik für die Benutzer spürbar irgendwo in die Knie geht. In DOS-Zeiten hätte ich nicht so gearbeitet, weil es im Hinblick auf den verfügbaren Massenspeicher riskant gewesen wäre. Das Problem aber gibt es nicht mehr.
Das ist ohnehin ein Prinzip, das man verinnerlichen sollte, das aber für viele von uns, die noch in Platz- und Zeitspareneopchen das Programmieren gelernt haben, schwer in die Köpfe zu bekommen ist. Ich habe beispielsweise eine Funktionalität, die in einer Tabellendarstellung gewaltige Datenmengen aus zig Tabellen aufbereitet. Das geschah bis vor kurzem zur Laufzeit; es sind also immer dieselben Daten aufbereitet worden, die sich allerdings auch laufend ändern konnten. Inzwischen habe ich diese Datenaufbereitung in jene Prozesse gezogen, die Daten ändern können, wodurch diese kaum spürbar verlangsamt wurden, aber die Darstellung der gesamten Datenmenge sehr, sehr rasant geworden ist. Hierfür waren zusätzliche Tabellen und Eingriffe an sehr vielen Stellen nötig. Das Ergebnis ist verblüffend, ohne dass die gesamte Systematik für die Benutzer spürbar irgendwo in die Knie geht. In DOS-Zeiten hätte ich nicht so gearbeitet, weil es im Hinblick auf den verfügbaren Massenspeicher riskant gewesen wäre. Das Problem aber gibt es nicht mehr.
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
Ich sprach oben von CUSTOM INDEXgeorg hat geschrieben:die Überlegung, mehrere Felder in den Index zu nehmen, hat was für sich, aber auch was gegen sich: nämlich die Begrenzung des Index-Ausdrucks sowie des Wertes, der als Ergebnis des Ausdrucks kommt.
Man indiziert also nicht den Inhalt eines oder mehrerer Felder, sondern legt den KEY-Ausdruck fest, der im Index zu einem Datensatz gespeichert wird.INDEX ...
CUSTOM
Durch die Option CUSTOM wird ein Custom-Index erzeugt. Ein Custom-Index ist nach der Erzeugung leer und die enthaltenen Schlüsselwerte werden nicht automatisch durch die DatabaseEngine verwaltet. Die Schlüsselwerte eines Custom-Index müssen stattdessen vom Entwickler hinzugefügt bzw. entfernt werden. Dafür werden die Funktionen OrdKeyAdd() und OrdKeyRemove() verwendet.
Die Erklärung von OrdKeyAdd() ist allerdings nicht ganz eindeutig (wie man den KEY festlegt), genutzt habe ich das noch nie, aber dafür müsste es da sein.
Gruß
Hubert
Hubert
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2825
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 96 Mal
- Danksagung erhalten: 13 Mal
Re: Suche in großen Datenbeständen
Hallo, Hubert -
soweit ich die Dokumentation verstehe, wird der komplette Schlüsselbegriff in den Index eingefügt, wenn OrdKeyAdd() ausgeführt wird.
Der Unterschied ist nur, dass man einen Datensatz aus der zugrundeliegenden Select()-Area zwischen 0 und n-mal in den Index aufnehmen kann, und dieser nicht standardmässig 1 mal aufgenommen wird (UNIQUE und CANDIDATE bleiben da mal aussen vor). Laut Dokumentation geschieht die Aufnahme des Index (und damit des Index-Begriffs) aber durch die DBE und lässt sich vom Programmierer nicht beeinflussen.
OrdKeyAdd() ermittelt den Wert für den Index-Key und schreibt diesen Wert mit dem Verweis auf den Datensatz in den Index. Mehr kann's nicht sein, da OrdKeyAdd() nur einen Verweis auf den Tag als Parameter akzeptiert.
Dadurch gelten natürlich weiter die Beschränkungen, welche die DBE für Ausdruck und Wert des Index festlegt.
(Siehe auch OrdKeyAdd).
soweit ich die Dokumentation verstehe, wird der komplette Schlüsselbegriff in den Index eingefügt, wenn OrdKeyAdd() ausgeführt wird.
Der Unterschied ist nur, dass man einen Datensatz aus der zugrundeliegenden Select()-Area zwischen 0 und n-mal in den Index aufnehmen kann, und dieser nicht standardmässig 1 mal aufgenommen wird (UNIQUE und CANDIDATE bleiben da mal aussen vor). Laut Dokumentation geschieht die Aufnahme des Index (und damit des Index-Begriffs) aber durch die DBE und lässt sich vom Programmierer nicht beeinflussen.
OrdKeyAdd() ermittelt den Wert für den Index-Key und schreibt diesen Wert mit dem Verweis auf den Datensatz in den Index. Mehr kann's nicht sein, da OrdKeyAdd() nur einen Verweis auf den Tag als Parameter akzeptiert.
Dadurch gelten natürlich weiter die Beschränkungen, welche die DBE für Ausdruck und Wert des Index festlegt.
(Siehe auch OrdKeyAdd).
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
Beim Erstellen sollte man natürlich keine Feldnamen angeben, sondern eine Funktion oder einen Codeblock, der den gewünschten Schlüsselbegriff angibt.
Aber wie geschrieben habe ich das noch nie benutzt. Ich meine aber es gibt ein Beispiel in den Samples ... wie auch immer, war nur so ein Gedanke.
Aber wie geschrieben habe ich das noch nie benutzt. Ich meine aber es gibt ein Beispiel in den Samples ... wie auch immer, war nur so ein Gedanke.
Gruß
Hubert
Hubert
- azzo
- Rekursionen-Architekt
- Beiträge: 483
- Registriert: So, 28. Mär 2010 19:21
- Danksagung erhalten: 11 Mal
Re: Suche in großen Datenbeständen
Hallo,
Was ist schnell oder langsam für Volltextsuche.
Ich habe folgenden Test gemacht:
Kundendatenbank (125 Felder)
205.250 Datensätze
Volltextsuche in allen Feldern nach "microsoft"
13.11.2012 22:27:20: START microsoft 80840.62
13.11.2012 22:27:22: fertig microsoft 80842.99
Treffer: 4 Datensätze
mfg
Otto
Was ist schnell oder langsam für Volltextsuche.
Ich habe folgenden Test gemacht:
Kundendatenbank (125 Felder)
205.250 Datensätze
Volltextsuche in allen Feldern nach "microsoft"
13.11.2012 22:27:20: START microsoft 80840.62
13.11.2012 22:27:22: fertig microsoft 80842.99
Treffer: 4 Datensätze
mfg
Otto
Code: Alles auswählen
static aKunden := {}
function SearchFile( suchbeg )
local nLocation, cData
local nOffset := 0
local cDBF := ( "kunden.dbf" )
local nPos := 0
*----------------------------------------------------------
suchbeg := ALLTRIM(Upper(suchbeg))
cData := Upper(MemoRead( cDBF ))
if Len(cData ) < 1
MetroMsgInfo( "Infobox","Not Data to Search","File Error")
Return Nil
endif
nOffset := 0
do while .t.
nPos := INT( AT( suchbeg, cData, nOffset ))
nLocation := INT( ( nPos - Header() ) / RecSize() ) + 1
nOffset := Header() + nLocation * RecSize() //+ RecSize()
if nPos > 0 .and. nPos < Header()
else
if nLocation < 1
Exit
else
select kunden
goto nLocation
if DELETED() = .F.
aAdd( aKunden, getrec() )
endif
endif
endif
enddo
Return Nil
//----------------------------------------------------------------------------//
- brandelh
- Foren-Moderator
- Beiträge: 15696
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
Das ist schnell
Solange die DBF in einen String passt geht das mit memoread(). Wenn die Datei größer wird muss man diese blockweise einlesen.
Zu Clipperzeiten hatte ich einmal so eine Funktion gesehen (ich habe sie nicht mehr) die den DELETED() Status im Feld direkt ausgewertet hat und noch auf Suchfelder beschränkte.
Das war sehr komplex und bei Strukturänderungen fehlerträchtig.
Dein Ansatz mit
ist genial und leicht zu erweitern um z.B. die Suche auf weniger Felder zu beschränken (einfach in dem Satz nochmal eine $ Suche auf die gewünschten Felder machen).
=D>
Solange die DBF in einen String passt geht das mit memoread(). Wenn die Datei größer wird muss man diese blockweise einlesen.
Zu Clipperzeiten hatte ich einmal so eine Funktion gesehen (ich habe sie nicht mehr) die den DELETED() Status im Feld direkt ausgewertet hat und noch auf Suchfelder beschränkte.
Das war sehr komplex und bei Strukturänderungen fehlerträchtig.
Dein Ansatz mit
Code: Alles auswählen
select kunden
goto nLocation
if DELETED() = .F.
=D>
Gruß
Hubert
Hubert
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: Suche in großen Datenbeständen
Servus Otto,
Dein Code hat mich sehr interessiert, deshalb hab ich ihn sofort getestet. Was ich aber nicht verstehe, die dbf ist bei mir local shared geöffnet, das memoread ist dann aber erfolglos, auch mittels low-level-file Funktionen bekomme ich den Filefehler 32:
Mit Wordpad und Co. funktioniert das Öffnen...
Dein Code hat mich sehr interessiert, deshalb hab ich ihn sofort getestet. Was ich aber nicht verstehe, die dbf ist bei mir local shared geöffnet, das memoread ist dann aber erfolglos, auch mittels low-level-file Funktionen bekomme ich den Filefehler 32:
Obwohl memoread und ich mittels low-level die Dbf im readonly-Modus zu öffnen versuchen.Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
Mit Wordpad und Co. funktioniert das Öffnen...
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- nightcrawler
- 1000 working lines a day
- Beiträge: 651
- Registriert: Di, 24. Apr 2012 16:33
- Wohnort: 72184 Weitingen
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 96 Mal
- Kontaktdaten:
Re: Suche in großen Datenbeständen
schnell ist immer relativ. Ausgehend von den Rahmenbedingungen würde ich wagen zu behaupten, dass dies mit ADS im Bereich von 10ms (gegen Deine 2 Sek) erledigt ist. Volltext-Index vorausgesetzt.azzo hat geschrieben:Hallo,
Was ist schnell oder langsam für Volltextsuche.
Ich habe folgenden Test gemacht:
Kundendatenbank (125 Felder)
205.250 Datensätze
Volltextsuche in allen Feldern nach "microsoft"
13.11.2012 22:27:20: START microsoft 80840.62
13.11.2012 22:27:22: fertig microsoft 80842.99
Treffer: 4 Datensätze
Und Du kannst dann noch logische Suchen mit verknüpfen (zB "microsoft near windows and not office") und per SCORE bewerten, um die besten Treffer nach oben zu schieben. Aber das wollt Ihr ja nicht;)