2016-05-24 12 views
2

Ich habe eine Spalte mit einem Produktnamen. Einige Namen sehen aus wie 'ab-cd' 'ab cd' Ist es möglich, Volltextsuche zu verwenden, um diese Namen zu erhalten, wenn der Benutzertyp 'abc' (ohne Leerzeichen) verwendet wird? Der Operator like arbeitet für mich, aber ich würde gerne wissen, ob es möglich ist, die Volltextsuche zu verwenden.SQL Server Volltextsuche und Leerzeichen

+4

Volltextsuche ist * Sprache * orientiert. Es funktioniert in Form von * Wörtern * und * Phrasen *. Sie sollten nicht erwarten, dass es mit Leerzeichen oder Satzzeichen arbeitet, die es bereits verwendet, um die Wörter zu trennen. –

Antwort

1

Nein, leider können Sie solche Suche nicht über den Volltext durchführen. Sie können nur LIKE in diesem Fall LIKE ('ab%c%')

EDIT1 verwenden:

Sie eine Ansicht erstellen können (WITH SCHEMABINDING!) Mit einigen id und Spaltennamen, in dem Sie suchen möchten:

CREATE VIEW dbo.ftview WITH SCHEMABINDING 
AS 
SELECT id, 
     REPLACE(columnname,' ','') as search_string 
FROM YourTable 

Dann erstellen Index

CREATE UNIQUE CLUSTERED INDEX UCI_ftview ON dbo.ftview (id ASC) 

Dann cre aß Volltextsuchindex auf search_string Feld.

Danach können Sie CONTAINS Abfrage mit "abc*" suchen und es wird finden, was Sie brauchen.

EDIT2:

Aber es helfen werden nicht, wenn search_string nicht mit Ihrem Suchbegriff beginnt.

Zum Beispiel:

ab c d -> ABCD und Sie cd

+0

Ich verstehe Ihren Kommentar nicht. OP hat geschrieben: * Ist es möglich, die Volltextsuche zu verwenden, um diese Namen zu erhalten, wenn der Benutzertyp 'abc' (ohne Leerzeichen) * also, was ist 'nicht mit FTS'. Bitte klären Sie. – gofr1

+0

Entschuldigung, habe deine Antwort nicht gelesen. Ich glaube jedoch nicht, dass die Verkettung aller Wörter zu einem Superterm eine vernünftige Lösung ist. Was machen Sie, wenn der Superterm nicht mit Ihrem ersten Suchbegriff beginnt? – Jodrell

+0

Sie haben Recht, das ist ein Problem hier. Danke, ich sollte diese Info zu meiner Antwort hinzufügen. – gofr1

1

Nr Volltextsuche auf Wörter und Phrasen suchen basiert. Es speichert nicht den ursprünglichen Text. In der Tat wird es je nach Konfiguration nicht einmal alle Wörter speichern - es gibt sogenannte Stoppwörter, die niemals in den Index gehen. Beispiel: Im Englischen ist das Wort "in" nicht selektiv genug, um als speichernswert angesehen zu werden.

Einige Namen aussehen ‚ab-cd‘ ‚ab cd‘

Diejenigen wahrscheinlich nicht bekommen, überhaupt gespeichert. Zumindest das zweite Beispiel ist eigentlich 2 extrem kurze Wörter - ziemlich wahrscheinlich werden sie völlig ignoriert.

Also, nein - Volltextsuche ist dafür nicht geeignet.

+0

eigentlich sind 'ab' und' cd' keine Wörter in der Standard-Stop-Liste, also würde nicht ignoriert werden, aber Sie haben Recht, dass Sie ein Problem haben würden, nach tatsächlichen Stop/Noise-Wörtern zu suchen. – Jodrell

+0

Ich bin mir nicht sicher, ob es nicht auch eine minimale Wortlänge gibt - also können ab und cd deswegen einfach ignoriert werden. – TomTom

+0

'ab-cd' 'ab cd' - es waren keine echten Daten, nur ein Beispiel. Und danke für die Antwort - "Volltextsuche ist dafür nicht geeignet" - das wollte ich wissen – Serg88

1

Wenn Sie FTS verwenden möchten, um Begriffe zu finden, die nebeneinander liegen, wie Wörter, die durch ein Leerzeichen getrennt sind, sollten Sie einen Näherungsbegriff verwenden.

Sie können einen Näherungsbegriff definieren, indem Sie das Schlüsselwort NEAR oder den Operator ~ im Suchausdruck as documented here verwenden.

Also, wenn Sie wollen ab unmittelbar gefolgt von cd finden Sie den Ausdruck verwenden könnte,

'NEAR((ab,cd), 0)' 

für das Wort suchen ab gefolgt von dem Wort cd mit 0 Begriffe in-between.

+0

Aber wenn der Benutzer 'abc' in eine Suchzeichenfolge schreibt, wie würde ich jetzt das 'NEAR ((ab, cd), 0)' erstellen? – Serg88

+0

@ serg88, vermutlich müssten Sie den Text parsen und suchen, '' abc | a-bc | ab-c | abc | NEAR ((a, bc), 0) | NEAR ((ab, c), 0) | NEAR ((a, b, c), 0) '', wenn die Länge des Strings fortfährt, können Sie sehen, dass die Komplexität exponentiell anwächst. – Jodrell

Verwandte Themen