web-dev-qa-db-fra.com

Tiens à sélectionner l'existence indépendante du mot Whereever dans le texte

enter image description here

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 une "recherche" dans le texte soit renvoyé et il ne faut pas prendre "lSearch". I.e Selon l'image, trois premiers enregistrements seulement doivent être retournés.

7
balu

En utilisant comme

  • Une ligne unique 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 rembourrage, vous devrez gérer spécifiquement la chaîne d'apparaître au début/fin de la chaîne:

    WHERE
        [TextValue] LIKE '%Search%' --middle
        OR
        [TextValue] LIKE 'Search%'   --start
        OR
        [TextValue] LIKE '%Search'   --end
    

Utilisation de l'index Fulltext

Edit2, pour les puristes du texte complet

CREATE FULLTEXT INDEX sur les états MSDN pour l'option Auto (la valeur par défaut)

Bien que les modifications soient automatiquement propagées, ces modifications pourraient ne pas être reflétées immédiatement dans l'indice de texte intégral.

Donc, il peut ne pas donner de résultats corrects. Mais quelques secondes plus tard, il le fera.

De plus, pour quelques rangées de 10 000 rangs, il effectuera de manière adéquate: elle échoue O (n). J'utilise similaire sur une table avec environ 25 000 rangées, mais les utilisateurs savent qu'il fonctionnera mal s'ils recherchent de cette façon (c'est sur une page "avancée"). Je gagne dans le compromis en gérant un index de texte complet

La recherche de texte complet n'est pas la Solution correcte, c'est une Option

Note: Expérience m'a montré que l'indexation complète dutext dans SQL Server a de graves implications de performance, c'est-à-dire: uniquement mettre en œuvre si vous avez vraiment besoin de et vous savez ce que vous faites! (@Andrew bickerton)

8
gbn

Si votre table aura une quantité non triviale de lignes, vous voudrez peut-être essayer un index FullText. 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

Maintenant, recherchez votre texte:

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   CONTAINS([TextValue], 'Search')

Plus sur:

Je ne sais pas si SQL Server prend en charge \b Dans Regexes (match sur la limite de mot). Et vous devrez créer une fonction définie par l'utilisateur pour permettre la correspondance de RegEx en premier lie , mais si cela le fait, vous pouvez correspondre à:

\bSearch\b

Si ce n'est pas le cas, vous devriez toujours être capable de faire correspondre:

(^| )Search( |$)
1
Joe