Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Server Volltextsuche: Platzhalter für beliebige Zeichenfolge im Suchbegriff?? (https://www.delphipraxis.net/189745-sql-server-volltextsuche-platzhalter-fuer-beliebige-zeichenfolge-im-suchbegriff.html)

romber 15. Jul 2016 11:21

Datenbank: SQL Server • Version: 2012 • Zugriff über: ADO

SQL Server Volltextsuche: Platzhalter für beliebige Zeichenfolge im Suchbegriff??
 
Hallo!

Ich habe für eine Tabelle auf dem SQL Server einen Volltextindext eingerichtet und führe Suchanfragen mittels CONTAINS aus. Nun bin ich auf der Suche nach einer Möglichkeit den Suchbeggriff so zu definieren, dass Wortkombinationen mit unbekannten Zeichen im Wort gefunden werden. Z.B. brauche ich einen Suchbegriff, der sowohl "MQR2E1" als auch "MQR-2E1" oder "MQR 2E1" findet.

Ist das überhaupt möglich oder komme ich um die RegEx nicht herum in dem Fall? Bis jetzt habe ich die regulären Ausdrücke benutzt und war sehr unzufrieden damit. Die Anfragen dauerten ewig bei einer DB mit etwa 5M Einträge.

Danke!

Papaschlumpf73 15. Jul 2016 14:48

AW: SQL Server Volltextsuche: Platzhalter für beliebige Zeichenfolge im Suchbegriff??
 
SQL-Server Volltextindizes funktionieren m.E. nur mit Präfixausdrücken: z.B. "MQR*" aber nicht mit "MQR*2EI" oder "*2EI". Das macht auch Sinn. So wird nur jedes Wort indiziert und nicht jeder Buchstabe jedes Wortes.

Sofern deine Suche immer nach diesem Schema läuft, kannst du folgende Variante einsetzen:

1. Erstelle eine Funktion auf dem SQL-Server, welche alle Sonderzeichen, Leerzeichen usw. aus einem String entfernt und den "sauberen" String zurückgibt.

2. Erstelle ein zusätzliches Feld in der Tabelle, in den der "saubere" String (per Trigger) automatisch eingefügt/aktualisert wird. Der Trigger benutzt dazu die o.g. Funktion. Dieses neue Feld bekommt dann auch den Volltextindex.

3. Die CONTAINS-Abfrage benutzt auch die o.g. Funktion, um die Suchbegriffe zu bereinigen. Beispiel: CONTAINS(Table1, dbo.GetSauberenSuchbegriff(@Suchbegriff))

himitsu 18. Jul 2016 11:09

AW: SQL Server Volltextsuche: Platzhalter für beliebige Zeichenfolge im Suchbegriff??
 
Es kommt drauf an.
In verschiedenen DBMS kann man bei der Volltextsuche eingreifen, als was wie indiziert wird, oder man implementiert einfach alles selber.
  • In deinem Fall kannst du vor/bei der Indizierung Sonderzeichen ignorieren/entfernen.
  • Außerdem kann man z.B. ein Wort mehrfach indizieren, was das Problem mit dem *xxx behebt,
    z.B. das Wort "ABC" wird als "ABC", 'BC' und 'C' indiziert, (natürlich unter Berücksichtigung der minimalen Wortlänge),
    womit man dann auch indiziert nach der Wortmitte suchen könnte.
    Man kann da noch mehr machen, um z.B. den Index zu verkleinern, wie z.B. nur an silben trennen und nicht buchstabenweise,
    oder entsprechend den Wortstamm indizieren und dann halt auch die Suchausdrücke anpassen, vor der Suche usw.
  • man kann die Generierung des Suchindex beeinflussen oder halt vorher die Suchgrundlage bereinigen (siehe der genannte Tipp mit der zweiten Suchspalte)

https://msdn.microsoft.com/de-de/library/ms142571.aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 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