- Offizieller Beitrag
Hi,
ich habe mir Free German Dictionary heruntergeladen und daraus eine SQLite Datenbank erstellt germandict.db (Tabelle: dictionary, Feld: word).
Die Datenbank möchte ich zum Überprüfen von Texten bzw. bei Teileingaben für Wortvorschläge nutzen. Dazu habe ich 3 Funktionen erstellt die per SELECT Statement auf Übereinstimmung am Wortanfang oder Wortende prüfen oder auf im Wort enthalten. Die Datenbank enthält ~1,9 Millionen Einträge und auf meinem Rechner dauert eine Abfrage dann ca. 3,5 s.
Lässt sich das evtl. noch beschleunigen?
Hier der Code, DB ist zu groß für den Anhang, DL hier:
AutoIt
#include <SQLite.au3>
_SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1)
Global $hSQL = _SQLite_Open(@ScriptDir & "\germandict.db")
Global $iTimer = TimerInit()
;~ $res = __SelectStartsWith(-1, 'dictionary', 'word', 'taxi')
;~ $res = __SelectEndsWith(-1, 'dictionary', 'word', 'taxi')
$res = __SelectContaining(-1, 'dictionary', 'word', 'taxi')
ConsoleWrite('Count: ' & @extended & @LF)
ConsoleWrite('Time: ' & TimerDiff($iTimer) & @CRLF)
ConsoleWrite("$res:" & @LF & $res & @LF)
Func __SelectStartsWith($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%s%%';", $_sField, $_sTable, $_sField, $_sValue)
Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
Return SetError(0,@extended,$sResult)
EndFunc
Func __SelectEndsWith($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%%%s';", $_sField, $_sTable, $_sField, $_sValue)
Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
Return SetError(0,@extended,$sResult)
EndFunc
Func __SelectContaining($_hSQL, $_sTable, $_sField, $_sValue, $_sDelim=@CRLF)
Local $sSQL = StringFormat("SELECT %s FROM %s WHERE %s LIKE '%%%s%%';", $_sField, $_sTable, $_sField, $_sValue)
Local $sResult = __SelectFromWord($_hSQL, $sSQL, $_sDelim)
Return SetError(0,@extended,$sResult)
EndFunc
Func __SelectFromWord($_hSQL, $_sSQL, $_sDelim=@CRLF)
Local $aQuery, $hQuery, $sResult = '', $nRes = 0
_SQlite_Query($_hSQL, $_sSQL, $hQuery)
While _SQLite_FetchData($hQuery, $aQuery, False, False) = $SQLITE_OK
$sResult &= $aQuery[0] & $_sDelim
$nRes += 1
WEnd
_SQLite_QueryFinalize($hQuery)
$sResult = $nRes > 0 ? StringTrimRight($sResult, StringLen($_sDelim)) : $sResult
Return SetError(0,$nRes,$sResult)
EndFunc
_SQLite_Close($hSQL)
_SQLite_Shutdown()
Alles anzeigen