より大きなシステムの一部として検索を開発しています。
私たちは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)
実際、そのような記録は約10万件あります。
ユーザーは「@ gmail.com」のようなメールの一部を指定でき、これにより、いずれかのEmail, Contacts1, Contacts2, Contacts3, Contacts4
フィールドにGmailのメールアドレスが含まれるすべての行が返されます。
電話番号についても同じです。ユーザーは「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
と。REF:全文検索の動作の変更user@gmail.com
gmail
com
.
ます。
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+'%')
の各フィールドに5についての個々のインデックスを作成し、主キーなどがあります。
nvarchar(MAX)
ここにあるのですか?聞いたことも、名前が10億人以上の人に会ったこともありません。また、この回答によれば、メールアドレスは254文字を超えることはできません。そこにも10億〜の無駄なキャラクターがいます。