LIKE pour sélectionner l'existence indépendante du mot où dans le texte
-
16-10-2019 - |
Question
J'ai une table avec les textes suivants et le mot clé que je recherche est « Search'.So j'ai écrit une requête
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
[TextValue] LIKE '%Search%'
Q.1 Comment puis-je modifier la requête afin que seuls les enregistrements ayant « Recherche » dans le texte est retourné et ne devraient pas prendre « lsearch ». i.e. selon l'image des trois premiers enregistrements ne doivent être retournés.
La solution
Utilisation comme
-
Une seule ligne comme la recherche:
WHERE ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%' /* [] contains list of allowable characters, adding spaces around [TextValue] removes need to have multiple OR [TextValue] LIKE */
-
Sans vous padding devra gérer spécifiquement la chaîne apparaissant au début / fin de la chaîne:
WHERE [TextValue] LIKE '%Search%' --middle OR [TextValue] LIKE 'Search%' --start OR [TextValue] LIKE '%Search' --end
Utilisation FULLTEXT INDEX
Edit2, pour les puristes en texte intégral
CREATE FULLTEXT INDEX
sur MSDN indique l'option AUTO (par défaut)
Bien que les modifications sont automatiquement répercutées, ces changements pourraient ne pas se traduire immédiatement dans l'index de texte intégral.
Alors, il ne peut pas donner des résultats corrects. Mais quelques secondes plus tard, il le fera.
En outre, pour jusqu'à quelques lignes 10k, il fonctionne de manière adéquate: il échelles O (n). J'utilise LIKE sur une table avec environ 25k lignes, mais les utilisateurs sais que cela va mal si elles effectuer la recherche de cette façon (il est sur une page « avancée »). Je gagne dans le commerce hors de la gestion d'un index de texte intégral
recherche plein texte n'est pas la solution correcte, il est une option
Remarque: L'expérience m'a montré que l'indexation FullText dans SQL Server a des implications graves de performance, à savoir: mettre en œuvre uniquement si vous avez vraiment besoin et vous savez ce que vous faites! (@ Andrew Bickerton)
Autres conseils
Si votre table aura une quantité non négligeable de lignes, vous pouvez essayer un index FULLTEXT à la place. Ce sera beaucoup plus rapide et correspondra juste sur le mot exact.
CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;
CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table
Recherchez maintenant votre texte:
SELECT [ID]
,[TextValue]
FROM
[dbo].[SearchLike]
WHERE
CONTAINS([TextValue], 'Search')
En savoir plus sur:
- CREATE FULLTEXT CATALOGUE
- CREATE FULLTEXT INDEX
- CONTIENT
- COMME
Je ne sais pas si SQL serveur supporte \b
dans regexes (correspondance sur le mot boundry). Et vous devrez créer une fonction définie par l'utilisateur pour permettre l'appariement regex en premier lieu , mais si elle le fait, vous pouvez correspondre à:
\bSearch\b
Si ce ne est pas, vous devriez toujours être en mesure de correspondre à:
(^| )Search( |$)