How do you get leading wildcard full- recherches de texte pour travailler dans SQL Server?

Translate

Remarque:jeamen utilisant les capacités de recherche en texte intégral de SQL, les clauses CONTAINS et tout - le * est le caractère générique en texte intégral,% est pour les clauses LIKE uniquement.

J'ai lu à plusieurs endroits maintenant que les recherches de "premier caractère générique" (par exemple en utilisant "* overflow" pour correspondre à "stackoverflow") ne sont pas prises en charge dans MS SQL. J'envisage d'utiliser unFonction CLR pour ajouter une correspondance regex, mais je suis curieux de voir quelles autres solutions les gens pourraient avoir.

Plus d'informations: Vous ne pouvez ajouter l'astérisque qu'à la fin du mot ou de la phrase.- avec mon expérience empirique: lors de la mise en correspondance de "ma valeur", "mon *" fonctionne, mais "(astérisque) valeur" ne renvoie aucune correspondance, lors d'une requête aussi simple que:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');

Ainsi, mon besoin d'une solution de contournement. J'utilise uniquement la recherche sur mon site sur une page de recherche réelle - elle doit donc fonctionner essentiellement de la même manière que Google fonctionne (aux yeux d'un utilisateur de type Joe Sixpack). Pas aussi compliqué, mais ce genre de match ne devrait vraiment pas échouer.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Solution de contournement uniquement pour le caractère générique principal:

  • stocker le texte inversé dans un autre champ (ou en vue matérialisée)
  • créer un index de texte intégral sur cette colonne
  • trouver le texte inversé avec un *

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    

Bien sûr, il y a de nombreux inconvénients, juste pour une solution rapide ...

Sans oublier CONTAINSTABLE ...

La source
Translate

Le problème avec les caractères génériques principaux: ils ne peuvent pas être indexés, vous effectuez donc une analyse complète de la table.

La source
Chad Lee
Translate

Il est possible d'utiliser le caractère générique «*» à la fin du mot ou de la phrase (recherche de préfixe).

Par exemple, cette requête trouvera toutes les "datab", "database", "databases" ...

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')

Mais, de manière inattendue, il n'est pas possible d'effectuer une recherche avec le caractère générique principal.

Par exemple, cette requête ne trouvera pas «base de données»

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')
La source
Translate

Pour peut-être ajouter de la clarté à ce fil, d'après mes tests sur 2008 R2, Franjo a raison ci-dessus. Lors de la recherche de texte intégral, au moins lors de l'utilisation de la phrase CONTAINS, vous ne pouvez pas utiliser de début, seulement une traînefonctionnellement. * est le caractère générique, pas% en texte intégral.

Certains ont suggéré que * est ignoré. Cela ne semble pas être le cas, mes résultats semblent montrer que la fonctionnalité de fin * fonctionne. Je pense que les leaders * sont ignorés par le moteur.

Mon problème supplémentaire est cependant que la même requête, avec un * à la fin, qui utilise du texte intégral avec des caractères génériques a fonctionné relativement rapidement sur 2005 (20 secondes) et a ralenti à 12 minutes après la migration de la base de données vers 2008 R2. Il semble qu'au moins un autre utilisateur ait eu des résultats similaires et il a lancé un message sur le forum auquel j'ai ajouté ... FREETEXT fonctionne toujours rapidement, mais quelque chose "semble" avoir changé avec la façon dont 2008 traite la fin * dans CONTAINS. Ils donnent toutes sortes d'avertissements dans le Conseiller de mise à niveau indiquant qu'ils ont "amélioré" le TEXTE COMPLET afin que votre code puisse se casser, mais malheureusement, ils ne vous donnent aucun avertissement spécifique concernant certains codes obsolètes, etc. ... juste un avertissement qu'ils l'ont changé, À utiliser à vos risques et périls.

http://social.msdn.microsoft.com/Forums/ar-SA/sqlsearch/thread/7e45b7e4-2061-4c89-af68-febd668f346c

Peut-être, c'est le coup MS le plus proche lié à ces problèmes ...http://msdn.microsoft.com/en-us/library/ms143709.aspx

La source
Translate

Une chose à garder à l'esprit est que les principales requêtes génériques présentent une prime de performances significative par rapport aux autres utilisations génériques.

La source
Kev
Translate

Le caractère générique dans SQL Server est le%signe et cela fonctionne très bien, en tête, à la fin ou autrement.

Cela dit, si vous envisagez d'effectuer une recherche sérieuse de texte intégral, j'envisagerais d'utiliser les fonctionnalités d'index de texte intégral. En utilisant%et_les caractères génériques entraîneront une sérieuse baisse des performances de votre base de données.

La source
Translate

À partir de la documentation en ligne de SQL Server:

Pour écrire des requêtes de texte intégral dans Microsoft SQL Server 2005, vous devez apprendre à utiliser les prédicats Transact-SQL CONTAINS et FREETEXT et les fonctions de jeu de lignes CONTAINSTABLE et FREETEXTTABLE.

Cela signifie que toutes les requêtes écrites ci-dessus avec% et _ ne sont pas des requêtes de texte intégral valides.

Voici un exemple de ce à quoi ressemble une requête lors de l'appel de la fonction CONTAINSTABLE.

SELECT RANK, * FROM TableName, CONTAINSTABLE (TableName, *, '"* WildCard"') searchTable WHERE [KEY] = TableName.pk ORDER BY searchTable.RANK DESC

Pour que la fonction CONTAINSTABLE sache que j'utilise une recherche par caractères génériques, je dois l'envelopper entre guillemets. Je peux utiliser le caractère générique * au début ou à la fin. Il y a beaucoup d'autres choses que vous pouvez faire lorsque vous créez la chaîne de recherche pour la fonction CONTAINSTABLE. Vous pouvez rechercher un mot à côté d'un autre mot, rechercher des mots flexionnels (conduire = conduire, conduire, conduire et conduire) et rechercher le synonyme d'un autre mot (le métal peut avoir des synonymes tels que l'aluminium et l'acier).

Je viens de créer une table, de mettre un index de texte intégral sur la table et de faire quelques recherches de test et je n'ai pas eu de problème, donc la recherche par caractères génériques fonctionne comme prévu.

[Mettre à jour]

Je vois que vous avez mis à jour votre question et que vous devez utiliser l'une des fonctions.

Vous pouvez toujours rechercher avec le caractère générique au début, mais si le mot n'est pas un mot complet après le caractère générique, vous devez ajouter un autre caractère générique à la fin.

Example:  "*ildcar" will look for a single word as long as it ends with "ildcar".

Example:  "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard".  [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]

[Mise à jour n ° 2]

Dave Ward - L'utilisation d'un caractère générique avec l'une des fonctions ne devrait pas être un énorme succès. Si j'ai créé une chaîne de recherche avec juste "*", il ne retournera pas toutes les lignes, dans mon cas de test, il a renvoyé 0 enregistrements.

La source
Translate

Juste pour info, Google ne fait aucune recherche de sous-chaînes ou troncature, à droite ou à gauche. Ils ont un caractère générique * pour rechercher des mots inconnus dans une phrase, mais pas un mot.

Google, avec la plupart des moteurs de recherche en texte intégral, met en place un index inversé basé sur l'ordre alphabétique des mots, avec des liens vers leurs documents sources. La recherche binaire est très rapide, même pour les gros index. Mais c'est vraiment très difficile de faire une troncature à gauche dans ce cas, car cela perd l'avantage de l'index.

La source
Translate

En tant que paramètre dans une procédure stockée, vous pouvez l'utiliser comme:

ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName]
(
    @PROPRIETARY_NAME varchar(10)
)
as
    set nocount on
    declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"'

    select ldp.*, lkp.DRUG_PKG_ID
    from Lkp_DrugProduct ldp
    left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID
    where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2)
La source
Translate

En ce qui concerne la recherche de texte intégral, rien ne vaut pour mon argentLucène. Il y a unPort .Net disponiblecompatible avec les index créés avec la version Java.

Il y a un peu de travail à faire pour créer / maintenir les index, mais la vitesse de recherche est fantastique et vous pouvez créer toutes sortes de requêtes intéressantes. Même la vitesse d'indexation est assez bonne - nous reconstruisons complètement nos index une fois par jour et ne nous inquiétons pas de les mettre à jour.

Par exemple,cette fonctionnalité de rechercheest alimenté par Lucene.Net.

La source
Translate

Peut-être que le lien suivant fournira la réponse finale à cette utilisation des caractères génériques:Effectuer des recherches de caractères génériques FTS.

Notez le passage qui dit: "Cependant, si vous spécifiez"Chain »ou« Chain », vous n'obtiendrez pas le résultat attendu. L'astérisque sera considéré comme un signe de ponctuation normal et non comme un caractère générique. "

La source
Translate

Si vous avez accès à la liste de mots du moteur de recherche de texte intégral, vous pouvez effectuer une recherche «comme» sur cette liste et faire correspondre la base de données avec les mots trouvés, par exemple un tableau «mots» avec les mots suivants:

    pie
    applepie
    spies
    cherrypie
    dog
    cat

Pour faire correspondre tous les mots contenant 'pie' dans cette base de données sur une table fts 'full_text' avec le champ 'text':

    to-match <- SELECT word FROM words WHERE word LIKE '%pie%'
    matcher = ""
    a = ""
    foreach(m, to-match) {
      matcher += a
      matcher += m
      a = " OR "
    }
    SELECT text FROM full_text WHERE text MATCH matcher
La source
Translate

% Correspond à n'importe quel nombre de caractères _ Correspond à un seul caractère

Je n'ai jamais utilisé l'indexation de texte intégral, mais vous pouvez effectuer des requêtes de recherche assez complexes et rapides en utilisant simplement les fonctions de chaîne T-SQL intégrées.

La source