Chúng tôi đang phát triển một tìm kiếm như là một phần của hệ thống lớn hơn.
Chúng tôi có Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)
thiết lập này:
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
là một chuỗi chữ số được phân tách bằng dấu phẩy có cấu trúc như"77777777777, 88888888888"
Email
được cấu trúc chuỗi email với dấu phẩy như"email1@gmail.com, email2@gmail.com"
(hoặc không có dấu phẩy nào cả"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
là các trường văn bản nơi người dùng có thể chỉ định chi tiết liên hệ ở dạng miễn phí. Thích"John Smith +1 202 555 0156"
hay"Bob, +1-999-888-0156, bob@company.com"
. Các trường này có thể chứa email và điện thoại mà chúng tôi muốn tìm kiếm thêm.
Ở đây chúng tôi tạo ra các công cụ toàn văn
-- 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
Đây là một mẫu dữ liệu
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)
Thật ra chúng tôi có khoảng 100 ngàn hồ sơ như vậy.
Chúng tôi hy vọng người dùng có thể chỉ định một phần của email như "@ gmail.com" và điều này sẽ trả về tất cả các hàng có địa chỉ email Gmail trong bất kỳ Email, Contacts1, Contacts2, Contacts3, Contacts4
trường nào.
Tương tự cho số điện thoại. Người dùng có thể tìm kiếm một mẫu như "70283" và một truy vấn sẽ trả về điện thoại có các chữ số này. Ngay cả đối với Contacts1, Contacts2, Contacts3, Contacts4
các trường mẫu tự do , trước tiên chúng ta có thể xóa tất cả trừ các chữ số và ký tự khoảng trắng trước khi tìm kiếm.
Chúng tôi thường sử dụng LIKE
để tìm kiếm khi chúng tôi có khoảng 1500 hồ sơ và nó hoạt động tốt nhưng bây giờ chúng tôi có rất nhiều hồ sơ và việc LIKE
tìm kiếm mất vô hạn để có kết quả.
Đây là cách chúng tôi cố gắng để có được dữ liệu từ đó:
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
như một thuật ngữ tìm kiếm vì @
ký tự là một công cụ ngắt từ. Nói cách khác, tùy theo phiên bản của SQL Server mà bạn có, từ trong chỉ mục cho user@gmail.com
sẽ là một trong hai (A) user
, gmail
và com
hoặc (B) user
, user@gmail.com
, gmail
và com
. REF: Thay đổi hành vi đối với Tìm kiếm toàn văn bản
.
.
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+'%')
. Tạo khoảng năm chỉ mục riêng lẻ trên mỗi trường và bao gồm khóa chính.
nvarchar(MAX)
ở đây? Tôi chưa bao giờ nghe nói, hoặc gặp bất kỳ ai tên dài 1 tỷ ~ ký tự. Và, theo câu trả lời này , một địa chỉ email không thể dài hơn 254 ký tự; Vì vậy, bạn cũng có 1 tỷ ~ nhân vật lãng phí ở đó.