Recherche plein text – Contient plus un caractère générique et un guillemet simple

J'ai une table avec un champ de nom avec cette

Test O'neill 123 

Si j'utilise

 SELECT * FROM table F WHERE CONTAINS ( F.*, '"Test O''neill 123"' ) 

cela fonctionne bien mais si j'utilise un joker * je n'obtiens aucun résultat.

 SELECT * FROM table f WHERE CONTAINS ( F.*, '"Test O''neill 123*"' ) 

Pourquoi est-ce ? J'utilise un parsingur pour mes termes de search et j'ajoute le caractère générique *

J'ai vérifié certains sites, à propos d'échapper à la ' mais je n'ai rien trouvé à ce sujet ..

Merci d'avance

Le problème est dû à la combinaison de 1) l'utilisation du langage neutre 2) plus une list d'arrêt pour votre index de text intégral 3) plus un comportement inattendu lors de l'utilisation d'un caractère générique dans une search qui inclut des mots vides.

Le langage Neutre ne couvre pas toutes les nuances de la langue anglaise, donc à l'index-time, il considère O'neill comme 2 mots séparés O et neill . Votre stoplist considère alors que O est un mot d'ordre, donc ce "mot" n'est pas ajouté à l'index, seulement neill est.

Au moment de la search, le moteur de search ignore généralement les mots d'arrêt dans les phrases de plusieurs mots. Par exemple, la search de Contains(*, '"we x people"') correspondra au text ...we the people... , x et the deux étant des mots vides et donc "correspondant" automatiquement. (J'utilise vaguement le terme "matching" parce que le moteur de search ne correspond pas aux mots vides, mais il sait plutôt que les people sont à 1 mot de we .)

Ainsi, vous pouvez vous attendre à ce que la search générique Contains(*, '"we the people*"') trouve également sa correspondance, sauf qu'elle ne fonctionne pas avec une list d'arrêt . S'il n'y avait pas le mot de passe dans la phrase de search, ou si the mot n'était pas un mot de passe, la search fonctionnerait correctement. Je ne peux vraiment pas expliquer ce comportement mais je soupçonne que cela a quelque chose à voir avec la façon dont les positions des mots sont calculées. Je soupçonne aussi que ce n'est pas le comportement voulu.

Revenons à votre cas, Contains(*, '"Test O''neill 123"') findont une correspondance mais la search générique Contains(*, '"Test O''neill 123*"') ne le sera pas. (Vous pouvez même simplifier la search à Contains(*, '"O''neill*"') et vous verrez qu'il ne trouve toujours pas de correspondance.) La combinaison du mot d'arrêt O avec un caractère générique se heurte au problème J'ai expliqué dans le dernier paragraphe. C'est le noeud du problème énoncé dans votre question.

Des solutions allant du plus efficace au less efficace, mais peut-être plus pratique pour votre cas:

1) Changez la langue de votre index de text intégral en anglais et réindexez. Cela causera O'neill d'être traité comme un seul mot et ainsi vous éviterez le comportement générique bizarre que j'ai expliqué. Vous pouvez modifier la langue dans les propriétés d'index de text intégral via SQL Server Management Studio ou en supprimant et en recréant l'index comme suit:

 ALTER FULLTEXT INDEX ON MyTable DROP (Column1) GO ALTER FULLTEXT INDEX ON MyTable ADD (Column1 LANGUAGE [English]) -- repeat for each column in the index 

2) Si vous devez continuer à utiliser le langage neutre, pensez à supprimer O de votre list d'arrêt et à ré-indexer.

 ALTER FULLTEXT STOPLIST MyStoplist DROP 'o' LANGUAGE 'Neutral'; 

3) Ou ne pas utiliser une list d'arrêt si vous n'en avez pas besoin.

 ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

4) Si aucune des solutions ci-dessus n'est pratique, envisager de supprimer les mots vides de la phrase de search, ou au less le préfixe O' dans les noms de famille.