AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Volltextsuche in Blob möglichst schnell
Thema durchsuchen
Ansicht
Themen-Optionen

Volltextsuche in Blob möglichst schnell

Ein Thema von Teekeks · begonnen am 26. Jun 2011 · letzter Beitrag vom 27. Jun 2011
Antwort Antwort
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 18:21
Hmmm gut. Wir haben schon mal Firebird 2.1 am laufen.
Zeichensatz ist UTF8.
Wie viele sind den dort maximal möglich?
Laut einem Text von 2006 ist da maximal etwa 10000 Zeichen möglich, aber auch schon 4000 schlagen ja fehl.
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 18:28
Die Begrenzung ist wie gesagt 32765. Bei Firebird >=2.5 wird dann auch ein Textblob der kürzer ist wie ein VARCHAR-Feld behandelt

Zitat:
BLOB Subtype 1 Compatibility with VARCHAR
A. dos Santos Fernandes
(v.2.1) At various levels of evaluation, the engine now treats text BLOBs that are within the 32,765-byte string size limit as though they were VARCHARs. Operations that now allow text BLOBs to behave like strings are:
• Assignments, conversions and concatenations (|| operator)
• Operators = , <>, >, <, >=, <=, BETWEEN, IS [NOT] DISTINCT FROM
• Functions CAST, BIT_LENGTH, CHAR[ACTER]_LENGTH, OCTET_LENGTH, LEFT, RIGHT, HASH, LOWER, UPPER, LPAD, RPAD, TRIM, OVERLAY, REPLACE, POSITION, REVERSE, MINVALUE, MAXVALUE, SUBSTRING
• Existential predicators IN, ANY/SOME, ALL • Search predicators CONTAINING, STARTING [WITH], LIKE
• A LIST expression. Note that, prior to v.2.1.4, the last part of the result may be truncated, an effect that applies to native VARCHAR columns also.
Markus Kinzler
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 18:33
Woran liegt es dann aber das ich bei diesem SQL-Befehl:
Code:
ALTER TABLE PE_REZEPTE ADD
test Varchar(10000);
Diese Fehlermeldung bekomme?
Zitat:
Dynamic SQL Error
SQL error code = -204
Data type unknown
Implementation limit exceeded
COLUMN TEST
Könnte das vl an Flamerobin liegen (mit diesem Programm lege ich die Felder an).
Irgendeinen Grund muss das doch haben dass es normalerweise geht, aber hier nicht.

Gruß Teekeks
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#4

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 18:39
Hmmmm. vielleicht solltest du einen anderen Ansatz wählen. Teile den Text doch in Wörter auf und schmeiss die Wörter in eine separate Tabelle: Jedes Wort bekommt dabei einen Verweis auf den Originaltext, bzw. seinen PK.

Dann kannst Du in der Worttabelle sehr schnell suchen, sofern du nach Wörtern bzw. dem Wortanfang suchst. Wenn Du dann noch die Wortposition mit speicherst (also das wievielte Wort im Text es ist), kannst Du sogar nach Inhalten suchen... Dann dürfen die gesuchten Worte nicht zu weit voneinander entfernt sein, d.h. die Wortpositionen sind z.B. < 10 oder so.

Auf 32k-Begrenzungen würde ich mich nicht einlassen, denn eine Beschränkung auf einer derart atomaren Ebene ist ein Designfehler.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 18:41
Ich hab es mal in IBExpert getestet. Hat problemlos funktioniert. Scheint also ein Problem von FlameRobin zu sein.

Zitat:
Hmmmm. vielleicht solltest du einen anderen Ansatz wählen ...
Nennt man Volltextindex und wurde schon als mögliche Lösung benannt.

Zitat:
Auf 32k-Begrenzungen würde ich mich nicht einlassen, denn eine Beschränkung auf einer derart atomaren Ebene ist ein Designfehler.
Diese Aussage verstehe ich nicht ganz.
Erstens sind die meisten Texte kürzer.
Zweitens kann man bei längerer Texten ja eine Textblob verwenden, dann existiert keine Beschränkung ( höchtens der Größe der Festplatte)
Bei Firebird >=2.1 würde ich auf jeden Fall einen Blob verwenden, weil man dann die Vorteile beider Implementierungen nutzen kann (siehe oben)
Markus Kinzler

Geändert von mkinzler (26. Jun 2011 um 18:50 Uhr)
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 18:49
Eigendlich reicht mir das Blob ja.
Und es wird ja sowieso als VarChar behandelt. In so fern sollte dass ja dann auch egal sein.
Ich habe ja schon weiter oben einen Teilansatz gefunden, aber irgendwie war meine Frage dann untergegangen.
Jetzt also noch mal:
Zitat:
Code:
SELECT Count(*) FROM PE_REZEPTE a WHERE a.Text like '%Fenchel%' and a.nummer=2
Kann ich dass jetzt für eine Nummer auch auf mehrere Begriffe ausweiten? Also das ich nicht nur nach "Fenchel" suche sondern auch z.B. nach "Banane"?
Weil jetzt wird ja nur zurück gegeben ob der eine Begriff da ist oder nicht, wobei sich Count ja momentan auf die anzahl der zurückgegebenen Datensätze (also ja Maximal 1 wegen dem eindeutigen Feld Nummer) bezieht.
Noch einmal danke für eure rege Beteiligung an der Diskussion!
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 18:52
Du kannst natürlich per OR mehrere Suchen kombinieren. Aber ohne einen Index wird das dann nicht gerade performant sein.
Markus Kinzler
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 19:00
Code:
SELECT Count(*) FROM PE_REZEPTE a WHERE (a.Text like '%Fenchel%' and a.nummer=2) or (a.Text like '%gut%' and a.nummer=2)
Das scheint es nicht zu sein was du meinst.

Noch mal zur verdeutlichung:
Wenn im Text sowol das Wort Fenchel als auch gut vorkommt, soll die zahl 2 zurück gegeben werden.
Bein nur einem der beiden eine 1 und bei keinem eine 0.

Bei meinem oberen Beispiel kommt (obwohl beide Begriffe vorkommen) die zahl 1 zurück.
Wobei ich ja nur die Where-Klausel mit or verknüpft habe und nicht die Abfrage.
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Volltextsuche in Blob möglichst schnell

  Alt 26. Jun 2011, 19:06
Z.B. so
SQL-Code:
select
    sum( wert)
from (
        select
            count( *) as wert
        FROM
            PE_REZEPTE WHERE Text containing :such1 and a.nummer=:nummer
    union
        select
            count( *) as wert
        FROM
            PE_REZEPTE WHERE Text containing :such2 and a.nummer=:nummer);
Wobei dann die Suchwörter nicht öfters im Text vorkommen dürfen
Markus Kinzler

Geändert von mkinzler (26. Jun 2011 um 19:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz