더 큰 시스템의 일부로 검색을 개발 중입니다.
우리는 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
, 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+'%')
작성하십시오. 각 필드에 약 5 개의 개별 색인을 작성하고 기본 키를 포함하십시오.
nvarchar(MAX)
여기에 있습니까? 이름이 10 억 ~자인 사람에 대해 들어 본 적이 없거나 만나 본 적이 없습니다. 이 답변 에 따르면 이메일 주소는 254자를 초과 할 수 없습니다. 그래서 당신은 또한 10 억 ~ 낭비 문자가 있습니다.