Question

J'ai un texte intégral tableau indexé dans SQL Server 2008 que je suis en train de requête pour un match de phrase exacte à l'aide FULLTEXT. Je ne crois pas à l'aide CONTIENT ou LIKE est approprié pour cela, parce que dans d'autres cas, la requête peut ne pas être exacte (utilisateur n'a pas la phrase Surround entre guillemets) et en général, je veux la flexibilité de FREETEXT.

Selon le rel="nofollow"> [MSDN] pour FREETEXT:

  

Si freetext_string est enfermé dans des guillemets doubles, un match de phrase est plutôt effectuée; éraflage et thésaurus ne sont pas effectuées.

qui me conduirait à croire une requête comme ceci:

SELECT Description  
FROM Projects   
WHERE FREETEXT(Description, '"City Hall"')  

ne ferait que renvoyer des résultats où le terme « City Hall » apparaît dans le champ Description, mais j'obtenir des résultats comme celui-ci:

  

1 Conception de rampe de handicap à Manning Hall.
  2 enquête antenne. Client: Ville de Cranston ingénierie Département
  3 enquête structurelle concernant les dégâts de feu à International Tennis Hall of Fame.
  4 Enquête enquête sur le toit pour la conception satellite proposée sur salle Herald.
  Etc ...

Il est évident que ces résultats comprennent au moins un des mots dans ma phrase, mais pas l'expression elle-même. Ce qui est pire, je pensais que les résultats seraient classés, mais les deux résultats que je voulais réellement (parce qu'ils comprennent l'expression réelle) sont enterrés.

SELECT Description  
FROM Projects  
WHERE Description LIKE '%City Hall%'  
  

1 Rénovation majeure extérieur et intérieur de l'hôtel de ville existant pour Quincy Massachusetts
  2 enquête structurelle de Pawtucket Superficielle City Hall tour en proie à des fuites.

Je suis sûr que ce soit un cas de moi de ne pas comprendre la documentation, mais est-il un moyen d'obtenir ce que je cherche? A savoir, pour pouvoir passer dans une chaîne de recherche sans les guillemets et obtenir exactement ce que je veux maintenant ou avec des citations et obtenir que cette expression exacte?

Était-ce utile?

La solution

Comme vous l'avez dit, FREETEXT regarde chaque mot dans votre phrase, pas l'expression comme un tout. Pour cela, vous devez utiliser l'instruction CONTAINS. Comme ceci:

SELECT Description  
FROM Projects   
WHERE CONTAINS(Description, '"City Hall"')

Si vous voulez obtenir le rang des résultats, vous devez utiliser CONTAINSTABLE. Il fonctionne à peu près le même, mais il retourne une table avec deux colonnes: [Key] Wich contient la clé primaire de la table de recherche et [Rank], ce qui vous donne le rang du résultat

.
scroll top