हम एक बड़ी प्रणाली के एक भाग के रूप में खोज विकसित कर रहे हैं।
हम 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 हजारों ऐसे रिकॉर्ड हैं।
हम उम्मीद करते हैं कि उपयोगकर्ता "@ gmail.com" जैसे ईमेल का एक हिस्सा निर्दिष्ट कर सकते हैं और यह किसी भी 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 सर्वर के संस्करण के आधार में, सूचकांक में शब्दों के लिए user@gmail.com
या तो (ए) हो जाएगा user
, gmail
और com
या (बी) 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 बिलियन ~ व्यर्थ अक्षर हैं।