Wir entwickeln eine Suche als Teil eines größeren Systems.
Wir haben Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)mit diesem Setup:
CREATE TABLE NewCompanies(
[Id] [uniqueidentifier] NOT NULL,
[Name] [nvarchar](400) NOT NULL,
[Phone] [nvarchar](max) NULL,
[Email] [nvarchar](max) NULL,
[Contacts1] [nvarchar](max) NULL,
[Contacts2] [nvarchar](max) NULL,
[Contacts3] [nvarchar](max) NULL,
[Contacts4] [nvarchar](max) NULL,
[Address] [nvarchar](max) NULL,
CONSTRAINT PK_Id PRIMARY KEY (Id)
);
Phoneist eine strukturierte durch Kommas getrennte Ziffernfolge wie"77777777777, 88888888888"Emailist eine strukturierte E-Mail-Zeichenfolge mit Kommas wie"email1@gmail.com, email2@gmail.com"(oder ohne Kommas wie"email1@gmail.com")Contacts1, Contacts2, Contacts3, Contacts4sind Textfelder, in denen Benutzer Kontaktdaten in freier Form angeben können. Wie"John Smith +1 202 555 0156"oder"Bob, +1-999-888-0156, bob@company.com". Diese Felder können E-Mails und Telefone enthalten, nach denen wir weiter suchen möchten.
Hier erstellen wir Volltextmaterial
-- FULL TEXT SEARCH
CREATE FULLTEXT CATALOG NewCompanySearch AS DEFAULT;
CREATE FULLTEXT INDEX ON NewCompanies(Name, Phone, Email, Contacts1, Contacts2, Contacts3, Contacts4, Address)
KEY INDEX PK_Id
Hier ist ein Datenbeispiel
INSERT INTO NewCompanies(Id, Name, Phone, Email, Contacts1, Contacts2, Contacts3, Contacts4)
VALUES ('7BA05F18-1337-4AFB-80D9-00001A777E4F', 'PJSC Azimuth', '79001002030, 78005005044', 'regular@hotmail.com, s.m.s@gmail.com', 'John Smith', 'Call only at weekends +7-999-666-22-11', NULL, NULL)
Tatsächlich haben wir ungefähr 100.000 solcher Aufzeichnungen.
Wir erwarten, dass Benutzer einen Teil der E-Mail wie "@ gmail.com" angeben können. Dies sollte alle Zeilen mit Google Mail-E-Mail-Adressen in einem der Email, Contacts1, Contacts2, Contacts3, Contacts4Felder zurückgeben.
Gleiches gilt für Telefonnummern. Benutzer können nach einem Muster wie "70283" suchen, und eine Abfrage sollte Telefone mit diesen Ziffern zurückgeben. Es ist sogar für Freiformfelder, Contacts1, Contacts2, Contacts3, Contacts4in denen wir wahrscheinlich zuerst alle außer Ziffern und Leerzeichen entfernen sollten, bevor wir suchen.
Früher haben LIKEwir für die Suche verwendet, als wir ungefähr 1500 Datensätze hatten und es hat gut funktioniert, aber jetzt haben wir viele Datensätze und die LIKESuche dauert unendlich, um Ergebnisse zu erhalten.
So versuchen wir, Daten von dort zu erhalten:
SELECT * FROM NewCompanies WHERE CONTAINS((Email, Contacts1, Contacts2, Contacts3, Contacts4), '"s.m.s@gmail.com*"') -- this doesn't get the row
SELECT * FROM NewCompanies WHERE CONTAINS((Phone, Contacts1, Contacts2, Contacts3, Contacts4), '"6662211*"') -- doesn't get anything
SELECT * FROM NewCompanies WHERE CONTAINS(Name, '"zimuth*"') -- doesn't get anything
@gmail.comals Suchbegriff verwendet wird, da der @Charakter ein Wortbrecher ist. Mit anderen Worten, je die Version von SQL Server Sie haben, Worte im Index für user@gmail.comwerden entweder (A) user, gmailund comoder (B) user, user@gmail.com, gmailund com. REF: Verhaltensänderungen bei der Volltextsuche
..
SELECT * FROM NewCompanies WHERE Id IN (SELECT ID from .... where MyOuterApply.EmailCol1 LIKE '%'+@SearchString+'%') OR Id IN (SELECT ID from .... where MyOuterApply.EmailCol2 LIKE '%'+@SearchString+'%')
nvarchar(MAX)hier? Ich habe noch nie von jemandem gehört oder jemanden getroffen, dessen Name 1 Milliarde Zeichen lang ist. Laut dieser Antwort darf eine E-Mail-Adresse nicht länger als 254 Zeichen sein. Sie haben dort also auch 1 Milliarde ~ verschwendete Charaktere.