Daha büyük bir sistemin parçası olarak bir arama geliştiriyoruz.
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)
Bu kurulumla sahibiz :
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
gibi yapılandırılmış virgülle ayrılmış basamak dizesidir"77777777777, 88888888888"
Email
gibi virgül ile e-postalar dize yapılandırılmıştır"email1@gmail.com, email2@gmail.com"
(gibi hiç virgül veya olmadan"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
kullanıcıların iletişim bilgilerini serbest biçimde belirleyebilecekleri metin alanlarıdır. Gibi"John Smith +1 202 555 0156"
veya"Bob, +1-999-888-0156, bob@company.com"
. Bu alanlar, daha fazla aramak istediğimiz e-postaları ve telefonları içerebilir.
Burada tam metin şeyler yaratıyoruz
-- 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
İşte bir veri örneği
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)
Aslında bu türden yaklaşık 100 bin kayıt var.
Kullanıcıların e-postanın "@ gmail.com" gibi bir bölümünü belirleyebileceğini umuyoruz ve bu, Gmail e-posta adreslerine sahip tüm satırları Email, Contacts1, Contacts2, Contacts3, Contacts4
alanlardan herhangi birinde döndürmelidir .
Aynı telefon numaraları için. Kullanıcılar "70283" gibi bir model arayabilir ve bir sorgu bu rakamları içeren telefonları döndürmelidir. Contacts1, Contacts2, Contacts3, Contacts4
Aramadan önce büyük olasılıkla rakamlar ve boşluk karakterleri hariç tümünü kaldırmamız gereken serbest form alanları için bile .
Biz LIKE
yaklaşık 1500 kayıt varken arama için kullanıyorduk ve iyi çalıştı ama şimdi çok fazla kayıt var ve LIKE
arama sonuç almak için sonsuz oluyor.
Oradan veri almaya çalışıyoruz:
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
Arama terimi olarak kullanan herhangi bir şey bulamıyorsunuz çünkü @
karakter bir kelime kırıcı. Sahip olduğunuz SQL Server sürümü olarak diğer deyişle, endekste kelimeler için user@gmail.com
ya (A) olacaktır user
, gmail
ve com
veya (B) user
, user@gmail.com
, gmail
ve com
. REF: Tam metin
.
.
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+'%')
Alanların her biri için yaklaşık beş ayrı dizin oluşturun ve birincil anahtarı
nvarchar(MAX)
burada? Daha önce hiç duymadım ya da adı 1 Milyar ~ karakter uzunluğunda olan biriyle tanışmadım. Ve bu cevaba göre , bir e-posta adresi 254 karakterden daha uzun olamaz; orada 1 Milyar ~ boşa harcanan karakter var.