Nous développons une recherche dans le cadre d'un système plus vaste.
Nous avons Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Standard Edition (64-bit)
avec cette configuration:
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
est une chaîne structurée de chiffres séparés par des virgules comme"77777777777, 88888888888"
Email
est une chaîne d'e-mails structurée avec des virgules comme"email1@gmail.com, email2@gmail.com"
(ou sans virgule du tout comme"email1@gmail.com"
)Contacts1, Contacts2, Contacts3, Contacts4
sont des champs de texte où les utilisateurs peuvent spécifier leurs coordonnées sous forme libre. Comme"John Smith +1 202 555 0156"
ou"Bob, +1-999-888-0156, bob@company.com"
. Ces champs peuvent contenir des e-mails et des téléphones que nous souhaitons rechercher davantage.
Ici, nous créons des trucs en texte intégral
-- 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
Voici un échantillon de données
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)
En fait, nous avons environ 100 milliers de ces enregistrements.
Nous nous attendons à ce que les utilisateurs puissent spécifier une partie de l'e-mail comme "@ gmail.com" et cela devrait renvoyer toutes les lignes avec les adresses e-mail Gmail dans l'un des Email, Contacts1, Contacts2, Contacts3, Contacts4
champs.
Idem pour les numéros de téléphone. Les utilisateurs peuvent rechercher un modèle comme "70283" et une requête doit renvoyer les téléphones contenant ces chiffres. C'est même pour les Contacts1, Contacts2, Contacts3, Contacts4
champs de formulaire libre où nous devrions probablement supprimer tout sauf les chiffres et les espaces d'abord avant de rechercher.
Nous avions l'habitude d'utiliser LIKE
pour la recherche lorsque nous avions environ 1500 enregistrements et cela fonctionnait bien, mais maintenant nous avons beaucoup d'enregistrements et la LIKE
recherche prend une infinité pour obtenir des résultats.
Voici comment nous essayons d'obtenir des données à partir de là:
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
que ce soit en tant que terme de recherche, car le @
personnage est un séparateur de mots. En d' autres termes, selon la version de SQL Server que vous avez, mots l'indice user@gmail.com
seront soit (A) user
, gmail
et com
(B) user
, user@gmail.com
, gmail
et com
. REF: changements de comportement à la recherche en texte
.
.
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)
ici? Je n'ai jamais entendu parler ou rencontré quelqu'un dont le nom contient 1 milliard ~ caractères. Et, selon cette réponse , une adresse e-mail ne peut pas contenir plus de 254 caractères; vous avez donc également 1 milliard ~ de personnages perdus.