Estamos desenvolvendo uma pesquisa como parte de um sistema maior.
Temos Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)
com esta configuração:
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
é uma sequência estruturada de dígitos separados por vírgula, como"77777777777, 88888888888"
Email
é uma sequência de e-mails estruturados com vírgulas como"email1@gmail.com, email2@gmail.com"
(ou sem vírgulas"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
são campos de texto em que os usuários podem especificar detalhes de contato de forma livre. Como"John Smith +1 202 555 0156"
ou"Bob, +1-999-888-0156, bob@company.com"
. Esses campos podem conter e-mails e telefones que desejamos pesquisar mais.
Aqui criamos material de texto completo
-- 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
Aqui está uma amostra de dados
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)
Na verdade, temos cerca de 100 milhares desses registros.
Esperamos que os usuários possam especificar uma parte do email como "@ gmail.com" e isso retorne todas as linhas com endereços de email do Gmail em qualquer um dos Email, Contacts1, Contacts2, Contacts3, Contacts4
campos.
O mesmo para números de telefone. Os usuários podem procurar um padrão como "70283" e uma consulta deve retornar telefones com esses dígitos. É mesmo para Contacts1, Contacts2, Contacts3, Contacts4
campos de formulário livre , onde provavelmente devemos remover todos os dígitos, exceto os caracteres de espaço, antes de pesquisar.
Costumávamos usar LIKE
a pesquisa quando tínhamos cerca de 1500 registros e funcionava bem, mas agora temos muitos registros e a LIKE
pesquisa leva infinitos para obter resultados.
É assim que tentamos obter dados a partir daí:
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
como termo de pesquisa porque o @
caractere é um separador de palavras. Em outras palavras, dependendo da versão do SQL Server que você tem, palavras no índice para user@gmail.com
vai ser (A) user
, gmail
e com
ou (B) user
, user@gmail.com
, gmail
e com
. REF: Alterações de comportamento na pesquisa de texto completo
.
.
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)
aqui? Eu nunca ouvi falar ou conheci alguém com o nome de 1 bilhão de caracteres. E, de acordo com esta resposta , um endereço de email não pode ter mais de 254 caracteres; então você também tem 1 bilhão de caracteres desperdiçados por lá.