আমরা একটি বৃহত সিস্টেমের অংশ হিসাবে একটি অনুসন্ধান বিকাশ করছি।
আমাদের 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
ব্যবহারকারীরা নিখরচায় যোগাযোগের বিশদ নির্দিষ্ট করতে পারে এমন পাঠ্য ক্ষেত্র are লাইক"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 বিলিয়ন ডলার নষ্ট অক্ষর রয়েছে।