Recherche de mots dans le voisinage d'autres mots avec NEAR

Vous pouvez utiliser un terme de proximité (NEAR) dans un prédicat CONTAINS ou une fonction CONTAINSTABLE pour rechercher des mots ou des expressions à proximité les uns des autres. Vous pouvez également spécifier le nombre maximal de termes de non-recherche qui séparent le premier et le dernier terme de recherche. De plus, vous pouvez rechercher des mots ou des expressions dans n'importe quel ordre ou dans un ordre spécifié. SQL Server 2012 prend en charge à la fois l'ancien terme de proximité générique, qui est maintenant déconseillé et le terme de proximité personnalisé, qui est une nouveauté de SQL Server 2012.

Dans cette rubrique

  • Terme de proximité personnalisé

  • Considérations supplémentaires concernant les recherches de proximité

  • Terme de proximité générique déconseillé

Terme de proximité personnalisé

Le terme de proximité personnalisé présente les nouvelles fonctions suivantes :

  • Vous pouvez spécifier le nombre maximal de termes de non-recherche, ou distance maximale, qui sépare le premier et le dernier terme de recherche pour établir une correspondance.

  • Si vous spécifiez le nombre maximal de termes, vous pouvez également spécifier l'ordre dans lequel les termes de recherche doivent figurer dans les correspondances.

Pour être une correspondance valide, une chaîne de texte doit :

  • commencer par l'un des termes de recherche spécifiés et se terminer par l'un des autres termes de recherche spécifiés ;

  • contenir tous les termes de recherche spécifiés ;

  • le nombre de termes de non-recherche, notamment de mots vides situés entre le premier et le dernier terme de recherche, doit être inférieur ou égal à la distance maximale, si celle-ci est spécifiée.

La syntaxe de base est la suivante :

NEAR (

     {

        search_term [ ,…n ]

     |

        ( search_term [ ,…n ] ) [, <maximum_distance> [, <match_order> ] ]

     }

       )

[!REMARQUE]

Pour plus d'informations sur la syntaxe de <custom_proximity_term>, consultez CONTAINS (Transact-SQL).

Par exemple, vous pourriez rechercher « John » à deux termes de distance de « Smith », comme suit :

CONTAINS(column_name, 'NEAR((John, Smith), 2)')

Les chaînes qui correspondent sont par exemple « John Jacob Smith » et « Smith, John ». La chaîne « John Jones knows Fred Smith » contient trois termes de non-recherche intermédiaires, donc ce n'est pas une correspondance.

Pour que les termes soient recherchés dans un ordre spécifié, vous pouvez modifier le terme de proximité de l'exemple en NEAR((John, Smith),2, TRUE). Cela permet de rechercher « John » à deux termes de distance de « Smith », mais uniquement à condition que « John » précède « Smith ». Dans une langue qui se lit de gauche à droite, tel que l'anglais, un exemple de chaîne correspondante est John Jacob Smith.

Notez que pour une langue qui se lit de droite à gauche, telle que l'arabe ou l'hébreu, le moteur d'indexation et de recherche en texte intégral applique les termes spécifiés dans l'ordre inverse. De même, l'Explorateur d'objets de SQL Server Management Studio inverse automatiquement l'ordre d'affichage des mots spécifiés dans les langues s'écrivant de droite à gauche.

[!REMARQUE]

Pour plus d'informations, consultez « Considérations supplémentaires concernant les recherches de proximité », plus loin dans cette rubrique.

Comment mesurer la distance maximale

Une distance maximale spécifique, telle que 10 ou 25, détermine combien de termes de non-recherche, notamment les mots vides, peuvent séparer le premier et le dernier terme de recherche dans une chaîne donnée. Par exemple, NEAR((dogs, cats, "hunting mice"), 3) retournerait la ligne suivante, dans laquelle le nombre total de termes de non-recherche est trois (« enjoy », « but » et « avoid ») :

« Cats enjoy hunting mice, but avoid dogs. »

Le même terme de proximité ne retournerait pas la ligne suivante, car les quatre termes de non-recherche (« enjoy », « but », « usually » et « avoid ») dépassent la distance maximale :

« Cats enjoy hunting mice, but usually avoid dogs. »

Combinaison d'un terme de proximité personnalisé avec d'autres termes

Vous pouvez combiner un terme de proximité personnalisé avec d'autres termes. Vous pouvez utiliser AND (&), OR ( |) ou AND NOT (&!) pour combiner un terme de proximité personnalisé avec un autre terme de proximité personnalisé, un terme simple ou un terme de préfixe. Par exemple :

  • CONTAINS('NEAR((term1,term2),5) AND term3')

  • CONTAINS('NEAR((term1,term2),5) OR term3')

  • CONTAINS('NEAR((term1,term2),5) AND NOT term3')

  • CONTAINS('NEAR((term1,term2),5) AND NEAR((term3,term4),2)')

  • CONTAINS('NEAR((term1,term2),5) OR NEAR((term3,term4),2, TRUE)')

Exemple :

CONTAINS(column_name, 'NEAR((term1, term2), 5, TRUE) AND term3')

Vous ne pouvez pas combiner un terme de proximité personnalisé avec un terme de proximité générique (term1 NEAR term2), un terme de forme canonique (ISABOUT …) ou un terme pondéré (FORMSOF …).

Exemple : utilisation du terme de proximité personnalisé

L'exemple suivant recherche dans la table Production.Document de l'exemple de base de données AdventureWorks2008 tous les résumés de document qui contiennent le mot « reflector » dans le même document que le mot « bracket ».

USE AdventureWorks2012
GO

SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable 
INNER JOIN CONTAINSTABLE(Production.Document, Document,
  'NEAR(bracket, reflector)' ) AS KEY_TBL
  ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC
GO

[Haut de la page]

Considérations supplémentaires concernant les recherches de proximité

Cette section présente des points à prendre en considération qui concernent à la fois les recherches de proximité génériques et personnalisées :

  • Chevauchement des occurrences des termes de recherche

    Les recherches de proximité ne cherchent toujours que des occurrences sans chevauchement. Les occurrences des termes de recherche qui se chevauchent ne sont jamais validées comme des correspondances. Par exemple, supposons le terme de proximité suivant, qui recherche « A » et « AA », dans cet ordre, à une distance maximale de deux termes :

    CONTAINS(column_name, 'NEAR((A,AA),2, TRUE')
    

    Les correspondances possibles sont, par exemple, « AAA », « A.AA » et « A..AA ». Les lignes contenant simplement « AA » ne correspondent pas.

    [!REMARQUE]

    Vous pouvez spécifier des termes qui se chevauchent, par exemple, NEAR("mountain bike", "bike trails") ou (NEAR(comfort*, comfortable), 5). Spécifier des termes qui se chevauchent rend la requête plus complexe en augmentant les permutations de correspondances possibles. Si vous spécifiez un grand nombre de termes se chevauchant, la requête peut échouer en raison de ressources insuffisantes. Dans ce cas, simplifiez la requête et réessayez.

  • NEAR générique et NEAR personnalisé (qu'une distance maximale soit spécifiée ou non) indiquent tous deux la distance logique entre les termes, plutôt que la distance absolue qui les sépare. Par exemple, les termes des différentes expressions ou phrases d'un paragraphe sont considérés comme plus éloignés que les termes situés dans une même expression ou phrase, indépendamment de leur proximité réelle, en supposant que leur relation soit moins étroite. De même, les termes situés dans des paragraphes différents sont considérés comme étant encore plus éloignés. Si une correspondance comprend la fin d'une phrase, d'un paragraphe ou d'un chapitre, l'intervalle utilisé pour le classement d'un document est augmenté respectivement de 8, 128 ou 1024.

  • Impact des termes de proximité sur le classement par la fonction CONTAINSTABLE

    Lorsque NEAR est utilisé dans la fonction CONTAINSTABLE, le nombre de résultats dans un document par rapport à sa longueur, ainsi que la distance entre le premier et le dernier terme de recherche dans chacun des résultats, affectent le classement de chaque document. Pour un terme de proximité générique, si les termes de recherche trouvés sont séparés de >50 termes logiques, le classement retourné sur un document est 0. Pour un terme de proximité personnalisé qui ne spécifie pas d'entier comme distance maximale, un document qui contient uniquement des résultats à intervalle de >100 termes logiques recevra un classement de 0. Pour plus d'informations sur le classement des recherches de proximité personnalisées, consultez Limiter les résultats de la recherche avec RANK.

  • Option de serveur transform noise words

    La valeur de transform noise words influe sur la manière dont SQL Server traite les mots vides, s'ils sont spécifiés dans les recherches de proximité. Pour plus d'informations, consultez Transformer les mots parasites (option de configuration de serveur).

[Haut de la page]

Terme de proximité générique déconseillé

Important

Cette fonctionnalité sera supprimée dans une prochaine version de Microsoft SQL Server. Évitez d'utiliser cette fonctionnalité dans de nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité. Nous vous recommandons d'utiliser le terme de proximité personnalisé.

Un terme de proximité générique indique que les termes de recherche spécifiés doivent figurer dans un document pour qu'une correspondance soit retournée, indépendamment du nombre de termes de non-recherche (la distance) entre les termes de recherche. La syntaxe de base est la suivante :

{ search_term { NEAR | ~ } search_term } [ ,…n ]

Par exemple, dans les exemples suivants, les mots « fox » et « chicken »doivent apparaître tous les deux, dans n'importe quel ordre, pour qu'une correspondance soit établie :

  • CONTAINS(column_name, 'fox NEAR chicken')

  • CONTAINSTABLE(table_name, column_name, 'fox ~ chicken')

[!REMARQUE]

Pour plus d'informations sur la syntaxe du <generic_proximity_term>, consultez CONTAINS (Transact-SQL).

Pour plus d'informations, consultez « Considérations supplémentaires concernant les recherches de proximité », plus loin dans cette rubrique.

Combinaison d'un terme de proximité générique avec d'autres termes

Vous pouvez utiliser AND (&), OR (|) ou AND NOT (&!) pour combiner un terme de proximité générique avec un autre terme de proximité générique, un terme simple ou un terme de préfixe. Par exemple :

   CONTAINSTABLE (Production.ProductDescription,
      Description, 
      '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)'
   )

Vous ne pouvez pas combiner de terme de proximité générique avec un terme de proximité personnalisé, tel que NEAR((term1,term2),5), un terme pondéré (ISABOUT …) ou un terme de forme canonique (FORMSOF …).

Exemple : utilisation du terme de proximité générique

L'exemple suivant utilise le terme de proximité générique pour rechercher le mot « reflector » dans le même document que le mot « bracket ».

USE AdventureWorks2012
GO

SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable INNER JOIN
  CONTAINSTABLE(Production.Document, Document,
  '(reflector NEAR bracket)' ) AS KEY_TBL
  ON DocTable.DocumentNode = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO

Notez que vous pouvez aussi inverser l'ordre des termes dans CONTAINSTABLE pour obtenir le même résultat :

CONTAINSTABLE(Production.Document, Document, '(bracket NEAR reflector)' ) AS KEY_TBL

Vous pouvez utiliser le caractère tilde (~) à la place du mot clé NEAR utilisé dans la requête précédente et obtenir les mêmes résultats :

CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket)' ) AS KEY_TBL

Il est possible de spécifier plusieurs mots ou expressions dans les conditions de recherche. Par exemple, il est possible d'écrire :

CONTAINSTABLE(Production.Document, Document, '(reflector ~ bracket ~ installation)' ) AS KEY_TBL

Cela signifie que « reflector » doit figurer dans le même document que « bracket », et que « bracket » doit figurer dans le même document que « installation ».

[Haut de la page]

Voir aussi

Référence

CONTAINSTABLE (Transact-SQL)

CONTAINS (Transact-SQL)

Concepts

Exécuter une requête avec une recherche en texte intégral