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)
);
Phone
ist eine strukturierte durch Kommas getrennte Ziffernfolge wie"77777777777, 88888888888"
Email
ist eine strukturierte E-Mail-Zeichenfolge mit Kommas wie"email1@gmail.com, email2@gmail.com"
(oder ohne Kommas wie"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
sind 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, Contacts4
Felder 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, Contacts4
in denen wir wahrscheinlich zuerst alle außer Ziffern und Leerzeichen entfernen sollten, bevor wir suchen.
Früher haben LIKE
wir 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 LIKE
Suche 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.com
als 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.com
werden entweder (A) user
, gmail
und com
oder (B) user
, user@gmail.com
, gmail
und 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.