Benutzer mit den meisten Antworten
Suchlogik zwischen LIKE und CONTAINS

Frage
-
Hallo,
habe jetzt die Spalte "Matchcode" als Volltextsuche indiziert. Die Suche dauert wirklich nur einen Bruchteil.
Jetzt verstehe ich aber die Logik nicht.
Bei der Abfrage mit Like : WHERE Matchcode Like '%alu%' AND Matchcode Like '%felge%'
wurden 12530 Treffer gebracht.
Jetzt mit:
WHERE CONTAINS(Matchcode, 'alu AND felge') ;
werden nur 11 Treffer angezeigt, komischerweise werden keine Ergebnisse angezeigt wo "alufelge" zusammen geschrieben ist.
Wie kann man die finden? (auser mit "OR", weil dann kommen nur unrelevante Suchergebnisse)
Gruß Bert
Antworten
-
Hallo Bert,
die Volltextsuche arbeitet deutlich komplexer als das simple LIKE.
Dort werden die Wörter zunächst in ihre Wortstämme zerlegt,
siehe Wörtertrennung und WortstammerkennungWobei der einfachste Fall - ähnlich dem LIKE eine Präfixsuche ist.
Eine Suffixsuche (ein vorangestelltes "*") kennt die Volltextsuche nicht - denn damit würden die Wortstämme nutzlos.Beachte: Dort wird ein "*" anstatt des "%" verwendet und Wörter werden in doppelte Anführungszeichen gesetzt.
Das Wort "Alu" ist zwar umgangssprachlich gebräuchlich, wird aber nicht als eigenständiges Wort getrennt:
SELECT * FROM sys.dm_fts_parser ('"Aluminiumfelge"', 1031, 0, 0) SELECT * FROM sys.dm_fts_parser ('"Alufelge"', 1031, 0, 0)
Da wäre u. U. ein Thesaurus gefragt - habe ich jetzt nicht probiert.
Dabei kann bei 3buchstabige Abkürzungen aber auch Unerwünschtes rauskommen.Die Volltextsuche kennt einige Abfrageausdrücke, siehe
Eine sehr kleine Auswahl:
Unterstützte Formen von Abfrageausdrücken (Volltextsuche)CREATE TABLE dbo.Match ( MatchId int IDENTITY(1,1 ) NOT NULL, MatchCode varchar(8000) NOT NULL, CONSTRAINT PK_Match PRIMARY KEY (MatchID)); INSERT INTO dbo.Match (MatchCode) VALUES ('Aluminium'), ('Alu'), ('Balustrade'), ('Felge'), ('Felgen'), ('Felgensatz'), ('Stahlfelge'), ('Stahlfelgen'), ('Aluminium-Felge'), ('Aluminiumfelge'), ('Alufelge'), ('Leichtmetallfelgen'), -- aus Amazon Katalog ('Alu Felgensatz 4x Felge 8 x 19" Land Rover Freelander 2'), ('FK Leichtmetall Felge 8x18 silber'), ('Felge Tuning Alu 10 x 8 PCD4H/110 71mm RP375822'), ('Felge für China-Roller, Alu, vorne, 2,15 x 10, 5 Speichen, silber (Scheibenbremse, bis Bj. `05) ' + '(Durchmesser f. Tachoantrieb 34,5 mm), Baotian BT49QT-9, BT50QT-9, Benzhou City Star YY50QT, Buffalo Wind 50, Eppella GMX 50, Jinlun Fighter 50, ' + 'JmStar Sunny, Breeze 50, Karcher KM 50, Kymco Filly, Motorro Hawk 50, Peugeot V-Click, Qingqi QM50QT-6, Rex RS 450, Sachs 49er, Sukida Sprint SK50QT, ' + 'Xinling XL50QT-B, Xintian (Kinroad) XT50QT, Zhongshen ZS50QT-4, Zhongyu ZY50QT-7'); --CREATE FULLTEXT CATALOG FC_Match WITH ACCENT_SENSITIVITY = ON AUTHORIZATION [dbo]; CREATE FULLTEXT INDEX ON dbo.Match (MatchCode LANGUAGE 1031) KEY INDEX [PK_Match] ON [FC_MATCH] WITH CHANGE_TRACKING AUTO; -- Deutsch GO
Einige Abfragen dazu:
SELECT 'Alu', * FROM dbo.Match WHERE CONTAINS(MatchCode, N'"Alu"', LANGUAGE 1031); SELECT 'Alu*', * FROM dbo.Match WHERE CONTAINS(MatchCode, N'"Alu*"', LANGUAGE 1031); SELECT 'Felge:', * FROM dbo.Match WHERE CONTAINS(MatchCode, N'"Felge"', LANGUAGE 1031);
-- Enthaltene Worte SELECT * FROM sys.dm_fts_index_keywords(DB_ID(), OBJECT_ID('dbo.Match'))
Beschreibungen zu den Sichten findest Du unter Dynamische Verwaltungssichten und -funktionen für die Volltextsuche (Transact-SQL)
Wobei das bei Deiner Produktionstabelle viele mehr sein dürften - zum Testen solltest ggf. auf einen kleineren Satz zurückgreifen.Gruß Elmar
- Als Antwort markiert Bertram Maurer Mittwoch, 10. August 2011 06:32
Alle Antworten
-
Hallo Bertram,
die Erklärung findest Du in MSDN unter CONTAINS => "Vergleich zwischen LIKE und der Volltextsuche" (kurz vor den Beispielen).
Die Volltextsuche sucht nach Wörter oder Wortprefixe wenn man noch ein * anhängt. Like durchsucht den Text nach einem beliebigen vorkommen des Suchpattern.
Du könntest die CONTAINS Abfrage noch um den zusammengesetzten Begriff erweitern:
WHERE CONTAINS(Matchcode, '"Alu" AND "Felge" OR "Alufelge"')
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Hallo Bert,
die Volltextsuche arbeitet deutlich komplexer als das simple LIKE.
Dort werden die Wörter zunächst in ihre Wortstämme zerlegt,
siehe Wörtertrennung und WortstammerkennungWobei der einfachste Fall - ähnlich dem LIKE eine Präfixsuche ist.
Eine Suffixsuche (ein vorangestelltes "*") kennt die Volltextsuche nicht - denn damit würden die Wortstämme nutzlos.Beachte: Dort wird ein "*" anstatt des "%" verwendet und Wörter werden in doppelte Anführungszeichen gesetzt.
Das Wort "Alu" ist zwar umgangssprachlich gebräuchlich, wird aber nicht als eigenständiges Wort getrennt:
SELECT * FROM sys.dm_fts_parser ('"Aluminiumfelge"', 1031, 0, 0) SELECT * FROM sys.dm_fts_parser ('"Alufelge"', 1031, 0, 0)
Da wäre u. U. ein Thesaurus gefragt - habe ich jetzt nicht probiert.
Dabei kann bei 3buchstabige Abkürzungen aber auch Unerwünschtes rauskommen.Die Volltextsuche kennt einige Abfrageausdrücke, siehe
Eine sehr kleine Auswahl:
Unterstützte Formen von Abfrageausdrücken (Volltextsuche)CREATE TABLE dbo.Match ( MatchId int IDENTITY(1,1 ) NOT NULL, MatchCode varchar(8000) NOT NULL, CONSTRAINT PK_Match PRIMARY KEY (MatchID)); INSERT INTO dbo.Match (MatchCode) VALUES ('Aluminium'), ('Alu'), ('Balustrade'), ('Felge'), ('Felgen'), ('Felgensatz'), ('Stahlfelge'), ('Stahlfelgen'), ('Aluminium-Felge'), ('Aluminiumfelge'), ('Alufelge'), ('Leichtmetallfelgen'), -- aus Amazon Katalog ('Alu Felgensatz 4x Felge 8 x 19" Land Rover Freelander 2'), ('FK Leichtmetall Felge 8x18 silber'), ('Felge Tuning Alu 10 x 8 PCD4H/110 71mm RP375822'), ('Felge für China-Roller, Alu, vorne, 2,15 x 10, 5 Speichen, silber (Scheibenbremse, bis Bj. `05) ' + '(Durchmesser f. Tachoantrieb 34,5 mm), Baotian BT49QT-9, BT50QT-9, Benzhou City Star YY50QT, Buffalo Wind 50, Eppella GMX 50, Jinlun Fighter 50, ' + 'JmStar Sunny, Breeze 50, Karcher KM 50, Kymco Filly, Motorro Hawk 50, Peugeot V-Click, Qingqi QM50QT-6, Rex RS 450, Sachs 49er, Sukida Sprint SK50QT, ' + 'Xinling XL50QT-B, Xintian (Kinroad) XT50QT, Zhongshen ZS50QT-4, Zhongyu ZY50QT-7'); --CREATE FULLTEXT CATALOG FC_Match WITH ACCENT_SENSITIVITY = ON AUTHORIZATION [dbo]; CREATE FULLTEXT INDEX ON dbo.Match (MatchCode LANGUAGE 1031) KEY INDEX [PK_Match] ON [FC_MATCH] WITH CHANGE_TRACKING AUTO; -- Deutsch GO
Einige Abfragen dazu:
SELECT 'Alu', * FROM dbo.Match WHERE CONTAINS(MatchCode, N'"Alu"', LANGUAGE 1031); SELECT 'Alu*', * FROM dbo.Match WHERE CONTAINS(MatchCode, N'"Alu*"', LANGUAGE 1031); SELECT 'Felge:', * FROM dbo.Match WHERE CONTAINS(MatchCode, N'"Felge"', LANGUAGE 1031);
-- Enthaltene Worte SELECT * FROM sys.dm_fts_index_keywords(DB_ID(), OBJECT_ID('dbo.Match'))
Beschreibungen zu den Sichten findest Du unter Dynamische Verwaltungssichten und -funktionen für die Volltextsuche (Transact-SQL)
Wobei das bei Deiner Produktionstabelle viele mehr sein dürften - zum Testen solltest ggf. auf einen kleineren Satz zurückgreifen.Gruß Elmar
- Als Antwort markiert Bertram Maurer Mittwoch, 10. August 2011 06:32