Kami sedang mengembangkan pencarian sebagai bagian dari sistem yang lebih besar.
Kami miliki Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)
dengan pengaturan ini:
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
adalah string digit yang dipisahkan koma terstruktur seperti"77777777777, 88888888888"
Email
adalah string email terstruktur dengan koma like"email1@gmail.com, email2@gmail.com"
(atau tanpa koma sama sekali"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
adalah bidang teks tempat pengguna dapat menentukan detail kontak dalam bentuk bebas. Suka"John Smith +1 202 555 0156"
atau"Bob, +1-999-888-0156, bob@company.com"
. Bidang ini dapat berisi email dan telepon yang ingin kami cari lebih lanjut.
Di sini kami membuat teks lengkap
-- 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
Ini adalah contoh data
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)
Sebenarnya kami memiliki sekitar 100 ribu catatan seperti itu.
Kami berharap pengguna dapat menentukan bagian dari email seperti "@ gmail.com" dan ini akan mengembalikan semua baris dengan alamat email Gmail di salah satu Email, Contacts1, Contacts2, Contacts3, Contacts4
bidang.
Sama untuk nomor telepon. Pengguna dapat mencari pola seperti "70283" dan kueri harus mengembalikan ponsel dengan angka-angka ini di dalamnya. Itu bahkan untuk Contacts1, Contacts2, Contacts3, Contacts4
bidang formulir gratis di mana kita mungkin harus menghapus semua kecuali karakter angka dan spasi terlebih dahulu sebelum mencari.
Kami dulu menggunakan LIKE
untuk pencarian ketika kami memiliki sekitar 1500 catatan dan itu bekerja dengan baik tetapi sekarang kami memiliki banyak catatan dan LIKE
pencarian membutuhkan waktu tak terbatas untuk mendapatkan hasil.
Inilah cara kami mencoba mendapatkan data dari sana:
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
sebagai istilah pencarian karena @
karakternya adalah pemecah kata. Dengan kata lain, tergantung versi SQL Server yang Anda miliki, kata-kata dalam indeks untuk user@gmail.com
akan baik (A) user
, gmail
dan com
atau (B) user
, user@gmail.com
, gmail
dan com
. REF: Perubahan Perilaku menjadi Pencarian Teks Lengkap
.
.
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+'%')
Buat sekitar lima indeks individu pada masing-masing bidang dan sertakan kunci utama
nvarchar(MAX)
sini? Saya belum pernah mendengar, atau bertemu orang yang namanya panjangnya 1 Miliar ~ karakter. Dan, menurut jawaban ini , alamat email tidak boleh lebih dari 254 karakter; jadi kamu juga punya 1 Billion ~ karakter terbuang di sana.