Rozwijamy wyszukiwanie w ramach większego systemu.
Mamy Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)
z tą konfiguracją:
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
jest ciągiem cyfr rozdzielonych przecinkami, np"77777777777, 88888888888"
Email
jest uporządkowanym ciągiem wiadomości e-mail z przecinkami podobnymi"email1@gmail.com, email2@gmail.com"
(lub w ogóle bez przecinków"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
to pola tekstowe, w których użytkownicy mogą podać dane kontaktowe w dowolnej formie. Jak"John Smith +1 202 555 0156"
lub"Bob, +1-999-888-0156, bob@company.com"
. Te pola mogą zawierać wiadomości e-mail i telefony, które chcemy dalej wyszukiwać.
Tutaj tworzymy treści pełnotekstowe
-- 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
Oto próbka danych
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)
W rzeczywistości mamy około 100 tysięcy takich zapisów.
Oczekujemy, że użytkownicy mogą określić część wiadomości e-mail, np. „@ Gmail.com”, co powinno zwrócić wszystkie wiersze z adresami e-mail Gmaila w dowolnym Email, Contacts1, Contacts2, Contacts3, Contacts4
polu.
To samo dotyczy numerów telefonów. Użytkownicy mogą wyszukiwać wzór taki jak „70283”, a zapytanie powinno zwrócić telefony z tymi cyframi. Dotyczy to nawet Contacts1, Contacts2, Contacts3, Contacts4
pól o dowolnych formach, w których prawdopodobnie powinniśmy usunąć wszystkie oprócz cyfr i spacji przed rozpoczęciem wyszukiwania.
Kiedyś mieliśmy do LIKE
wyszukiwania, kiedy mieliśmy około 1500 rekordów i działało dobrze, ale teraz mamy wiele rekordów, a LIKE
wyszukiwanie trwa nieskończenie, aby uzyskać wyniki.
W ten sposób staramy się uzyskać stamtąd dane:
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
jako wyszukiwanego terminu, ponieważ @
znak jest łamaczem słów. Innymi słowy, w zależności od wersji SQL Server masz, wyrazy w indeksie na user@gmail.com
będzie albo (A) user
, gmail
a com
lub (B) user
, user@gmail.com
, gmail
i com
. ODNIESIENIE: Zmiany w zachowaniu wyszukiwania
.
.
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+'%')
Utwórz około pięciu indywidualnych indeksów na każdym polu i
nvarchar(MAX)
tutaj? Nigdy nie słyszałem ani nie spotkałem nikogo, kto ma na imię 1 miliard ~ znaków. Zgodnie z tą odpowiedzią adres e-mail nie może być dłuższy niż 254 znaki; więc masz tam również 1 miliard ~ zmarnowanych postaci.