Install-Package SoftCircuits.FullTextSearchQuery
FullTextSearchQuery est une bibliothèque de classe .NET qui convertit un terme de recherche convivial en une requête Microsoft SQL Server valide en texte complet. Le code tente de détecter et de gérer tous les cas où la requête entraînerait autrement SQL Server à générer une erreur.
Microsoft SQL Server fournit une puissante fonction de recherche de texte intégral. Cependant, la syntaxe est plutôt cryptique, en particulier pour les non-programmeurs. De plus, il existe de nombreuses conditions qui peuvent amener SQL Server à lancer une erreur si les choses ne sont pas exactement bonnes.
FullTextSearchQuery convertit un terme de recherche de type Google convivial et de type Google en condition de requête SQL de recherche en texte intégral correspondant. Son objectif est de ne jamais jeter des exceptions sur une entrée mal formée. Il construit simplement la meilleure requête valide possible à partir de l'entrée.
La liste suivante montre comment les différentes entrées sont transformées.
| Saisir | Sortir | Description |
|---|---|---|
| abc | FORMSOF(INFLECTIONAL, abc) | Trouvez des formes inflexibles d'ABC. |
| ~ ABC | FORMSOF(THESAURUS, abc) | Trouvez des variations de thésaurus d'ABC. |
| "abc" | "abc" | Trouvez le terme exact ABC. |
| + ABC | "abc" | Trouvez le terme exact ABC. |
| "ABC" près de "Def" | "abc" NEAR "def" | Trouvez le terme exact ABC près du terme exact Def. |
| abc* | "abc*" | Trouve des mots qui commencent par ABC. |
| -Abc Def | FORMSOF(INFLECTIONAL, def) AND NOT FORMSOF(INFLECTIONAL, abc) | Trouvez des formes inflexionnelles de Def mais pas des formes inflexionnelles d'ABC. |
| abc def | FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) | Trouver des formes inflexionnelles à la fois ABC et déf. |
| ABC ou DEF | FORMSOF(INFLECTIONAL, abc) OR FORMSOF(INFLECTIONAL, def) | Trouvez des formes inflexibles d'ABC ou Def. |
| <+ ABC + DEF> | "abc" NEAR "def" | Trouvez le terme exact ABC près du terme exact Def. |
| ABC et (DEF ou GHI) | FORMSOF(INFLECTIONAL, abc) AND (FORMSOF(INFLECTIONAL, def) OR FORMSOF(INFLECTIONAL, ghi)) | Trouvez des formes inflexionnelles d'ABC et de Def ou GHI. |
Même après la génération d'une requête syntaxiquement correcte, SQL Server peut toujours générer une erreur pour certaines requêtes. Par exemple, dans le tableau ci-dessus, vous pouvez voir que l'ouput pour -abc def échange les deux sous-expressions. En effet, NOT FORMSOF(INFLECTIONAL, abc) AND FORMSOF(INFLECTIONAL, def) provoqueront une erreur. SQL Server n'aime pas le NOT au début. Dans cet exemple, FullTextSearchQuery échangera les deux sous-expressions (de chaque côté de AND ).
Après avoir construit une requête, FullTextSearchQuery vérifiera ceci et plusieurs autres conditions d'erreur et effectuera des corrections nécessaires. Le tableau suivant décrit ces conditions.
| Terme | Action prise |
|---|---|
| Pas Term1 et Term2 | Les sous-expressions ont échangé. |
| Pas Terme1 | Expression jetée. |
| Pas Term1 et non Term2 | Expression rejetée si le nœud est regroupé (parenthèse) ou est le nœud racine; Sinon, le nœud parent peut contenir une autre sous-expression qui rendra celui-ci valide. |
| Terme1 ou non Term2 | Expression jetée. |
| Terme1 Près de ne pas terme2 | Près de la conjonction a changé pour et. |
FullTextSearchQuery convertit toutes les conjonctions proches vers et lorsque l'une ou l'autre sous-expression n'est pas un internalNode avec le formulaire de formulaire.
Utilisez la méthode Transform() pour convertir une expression de recherche en une condition de recherche en texte intégral SQL Valide SQL. Cette méthode prend une requête de recherche conviviale et la convertit en une condition de recherche en texte intégral correctement formé qui peut être transmise aux fonctions CONTAINS ou CONTAINSTABLE des fonctions de SQL Server. Si la requête contient des termes non valides, le code fera ce qu'il peut pour renvoyer une condition de recherche valide. Si aucun terme valide n'a été trouvé, cette méthode renvoie une chaîne vide.
// Pass true to add the standard stop words
FtsQuery ftsQuery = new FtsQuery ( true ) ;
string searchTerm = ftsQuery . Transform ( text ) ; Dans l'exemple de requête SQL suivant, @SearchTerm est une référence à la chaîne renvoyée de Transform() .
SELECT select_list
FROM table AS FT_TBL INNER JOIN
CONTAINSTABLE(table, column, @SearchTerm) AS KEY_TBL
ON FT_TBL . unique_key_column = KEY_TBL.[KEY];Une chose à savoir est la gestion des mots d'arrêt par SQL Server. Les mots d'arrêt sont des mots tels que un , et le . Ces mots ne sont pas inclus dans l'index en texte intégral. SQL Server n'indexe pas ces mots car ils sont très courants et n'ajoutent pas à la qualité de la recherche. Étant donné que ces mots ne sont pas indexés, SQL Server ne trouvera jamais de correspondance pour ces mots. Le résultat est qu'une recherche d'un mot d'arrêt ne rendra aucun résultat, même si ce mot d'arrêt peut apparaître dans un article!
La meilleure façon de gérer cela semble être d'exclure ces mots de la requête SQL. La recherche de texte intégral facile vous permet de le faire en ajoutant des mots d'arrêt à la propriété de collection de StopWords . Les mots d'arrêt ne seront pas inclus dans la requête résultante à moins qu'ils ne soient cités, empêchant ainsi les mots d'arrêt dans la requête de bloquer tous les résultats.
La façon la plus simple d'ajouter une liste standard de mots d'arrêt à la collection de mots StopWords est de passer true au constructeur FtsQuery . (Pour voir quels mots ont été ajoutés, vous pouvez simplement inspecter la collection de StopWords .) Vous pouvez modifier la collection de StopWords à tout moment, selon les besoins.
Alternativement, SQL Server offre une option pour empêcher le problème décrit ci-dessus. L'option Transform Noise Words peut être utilisée pour permettre à SQL Server de retourner les correspondances même lorsque la requête contient un mot d'arrêt (mot de bruit). Définissez cette option sur 1 pour activer la transformation du mot de bruit. Voir l'option de configuration du serveur de mots transformés pour plus d'informations.
La requête suivante peut être utilisée pour obtenir les mots d'arrêt système d'une base de données SQL Server.
SELECT ssw . stopword , slg . name
FROM sys . fulltext_system_stopwords ssw
JOIN sys . fulltext_languages slg
ON slg . lcid = ssw . language_id
WHERE slg . lcid = 1033Pour plus d'informations et une discussion sur le code, veuillez consulter mon article Easy Text Recherche Requêtes.