เรากำลังพัฒนาการค้นหาซึ่งเป็นส่วนหนึ่งของระบบที่ใหญ่กว่า
เรามีMicrosoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)
การตั้งค่านี้:
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
เป็นสตริงตัวเลขคั่นด้วยเครื่องหมายจุลภาคที่มีโครงสร้างเช่น"77777777777, 88888888888"
Email
เป็นสตริงอีเมลที่มีโครงสร้างพร้อมเครื่องหมายจุลภาคเช่น"email1@gmail.com, email2@gmail.com"
(หรือไม่มีเครื่องหมายจุลภาคเหมือน"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
เป็นช่องข้อความที่ผู้ใช้สามารถระบุรายละเอียดการติดต่อในรูปแบบฟรี กดไลค์"John Smith +1 202 555 0156"
หรือ"Bob, +1-999-888-0156, bob@company.com"
ฟิลด์เหล่านี้สามารถมีอีเมลและโทรศัพท์ที่เราต้องการค้นหาเพิ่มเติม
ที่นี่เราสร้างเนื้อหาแบบเต็ม
-- 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
นี่คือตัวอย่างข้อมูล
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)
จริงๆแล้วเรามีบันทึกประมาณ 100,000 รายการ
เราคาดว่าผู้ใช้สามารถระบุส่วนของอีเมลเช่น "@ gmail.com" และสิ่งนี้ควรส่งคืนแถวทั้งหมดด้วยที่อยู่อีเมล Gmail ในEmail, Contacts1, Contacts2, Contacts3, Contacts4
ฟิลด์ใด ๆ
เช่นเดียวกับหมายเลขโทรศัพท์ ผู้ใช้สามารถค้นหารูปแบบเช่น "70283" และแบบสอบถามควรส่งคืนโทรศัพท์ด้วยตัวเลขเหล่านี้ มันยังเป็นContacts1, Contacts2, Contacts3, Contacts4
ช่องว่างของรูปแบบอิสระที่เราน่าจะลบทั้งหมดยกเว้นตัวอักษรตัวเลขและช่องว่างในตอนแรกก่อนค้นหา
เราเคยใช้LIKE
สำหรับการค้นหาเมื่อเรามีบันทึกประมาณ 1500 รายการและใช้งานได้ดี แต่ตอนนี้เรามีบันทึกจำนวนมากและการLIKE
ค้นหานั้นไม่มีที่สิ้นสุดเพื่อให้ได้ผลลัพธ์
นี่คือวิธีที่เราพยายามรับข้อมูลจากที่นั่น:
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
เป็นคำค้นหาเนื่องจาก@
ตัวละครเป็นตัวทำลายคำ ในคำอื่น ๆ ขึ้นอยู่กับรุ่นของ SQL Server ที่คุณมีคำในดัชนีสำหรับuser@gmail.com
จะเป็นอย่างใดอย่างหนึ่ง (A) user
, gmail
และcom
หรือ (B) user
, user@gmail.com
, และgmail
com
REF: การเปลี่ยนแปลงพฤติกรรมในการค้นหาข้อความแบบเต็ม
.
ดังนั้นจึงจะมีการเปลี่ยนแปลงอย่างมีนัยสำคัญที่จะทำลายลบ
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)
อยู่ที่นี่ ฉันไม่เคยได้ยินหรือพบใครที่มีความยาว 1 พันล้านอักขระ ~ และตามคำตอบนี้ที่อยู่อีเมลต้องมีความยาวไม่เกิน 254 อักขระ ดังนั้นคุณยังมี 1 พันล้าน ~ ตัวอักษรเสีย