Question

entrer image description ici

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.

Était-ce utile?

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:

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( |$)
Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top