2010-09-02 4 views
1

J'ai mis la main sur un serveur SQL Server 2008 édition développeur et c'est mes données:recherche en texte intégral SQL Server 2005

if exists (select * from dbo.sysobjects where id = object_id(N'test') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table test 
    create table test 
    (
    Id INT IDENTITY NOT NULL primary key, 
    data NVARCHAR(255) not null 
    ) 

    insert into test (data) values ('Hello world'); 
    insert into test (data) values ('Hello j-world'); 

Je voudrais trouver toutes les lignes qui contiennent j-monde tout en évitant comme par raisons d'efficacité.

Si je tente:

select 
    * 
from test 
where freetext 
(
    *, 
    N'j-world' 
); 

Je reçois toutes les lignes qui est incorrect. Dois-je implémenter mon propre disjoncteur ou quelque chose? Puis-je réellement utiliser iFTS dans cette situation?

Merci.

Christian

PS:

Permettez-moi jetai ma question de manière plus générale. Comment puis-je trouver des mots entrecroisés en utilisant FTS (j-world est juste un exemple)?

Répondre

1

Je ne comprends pas vraiment pourquoi voulez-vous FTS? Si vous voulez mars exacte, cela se fait en utilisant simplement LIKE:

  • SELECT * FROM test

    données LIKE '%% du monde
    • --results dans
      - Bonjour le monde!
  • SELECT * FROM test

    données LIKE '%% j-monde
    • --results dans
      --Hello j-monde!

Si vous voulez jouer avec FTS. Créer et mettre votre propre (sur mesure) en texte intégral STOPLIST

  • Je n'ai pas SQL Server 2005, mais j'ai vérifié que cela fonctionne en 2008.
    Docs indique qu'il est possible uniquement pour le niveau de compatibilité 100 (c'est-à-dire dans SQL Server 2008).
    Bien, essayez en 2005

Dans SSMS Bases de données \ votre_nom_base_de_données \ Storage \ Texte intégral STOPLIST -> le clic droit et choisissez "Nouveau STOPLIST texte intégral ...". Je l'ai nommé vgvStoplist et j'ai vérifié que le bouton radio "Créer un syoplist vide" était coché. Dans le menu contextuel de SSMS, cliquez sur dbo.test ---> Index de texte intégral -> Propriétés ---> Sélectionnez une page: Général, Liste d'index de texte intégral -> entrez le nom de la liste vide créée (Je suis entré dans vgvStoplist)

maintenant, la requête

select * from essai où contient (données, ' "j-monde")

retours seulement « H ello j-monde »(sans 'Bonjour tout le monde')

Cela peut aussi se faire par TSQL. Suivre msdn


Mise à jour ====:
Eh bien, votre question a montré que la notion de bruit est subjective. Cela a fonctionné parce que 'j' est le mot de passe du système (c.-à-d. Chercher dans le stoplist du système (*) avec la chaîne 'j' (3 symboles), voir aussi (**)) et '-' .

Je ne vous propose d'utiliser la liste des mots interdits vide. Je viens d'illustrer "comment" avec un minimum d'efforts de ma part.
L'élaboration des techniques qui vous conviennent est à vous. Je ne suis même pas expert dans ce domaine pour donner des conseils. Je vous ai répondu du principe de bon sens

Créer votre propre STOPLIST Texte intégral, remplissez-le avec votre contenu.
Vous souhaiterez peut-être réutiliser le contenu du stoplist du système.
Pour cela, vous pouvez créer

  • (*) script séparé du système antidico
    en créant un plus Texte intégral STOPLIST il marquage avec « Créer à partir du système antidico », puis script, il (« Fichier ... » ou « Nouvelle requête fenêtre de l'éditeur »),

puis créez votre propre script en en éditant une copie () en utilisant find et remplacement et/ou copier coller à partir & () .

(**) Voici un extrait de la copie scénarisé, nommé par moi comme vgv_sys_copy, du système FT STOPLIST:

ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'French'; 
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Italian'; 
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Japanese'; 
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Dutch'; 
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Russian'; 
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Swedish'; 
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'Simplified Chinese'; 
ALTER FULLTEXT STOPLIST [vgv_sys_copy] ADD 'j' LANGUAGE 'British English'; 

Update2
Je posté subquestion Performace gains of searching with FTS over it with LIKE on indexed colum(s)?

J'ai aussi remarqué que j'ai répondu en me basant sur des fonctionnalités non disponibles dans SQL Server 2005
Il devrait y avoir MSSQL \ FTData \ noiseENG.txt et j'ai aimé les réponses à Noise Words in Sql Server 2005 Full Text Search

J'aurais supprimé 'j'. En fait, si j'étais vous, j'aurais créé noiseENG.txt à partir de zéro. Mais ce sont vos décisions qui dépendent de votre contexte et de multiples facteurs inconnus pour moi.

Je crois que vous devriez le poster comme question séparée. J'ai déjà été banni plusieurs fois dans les sites StackExchange (et je suis toujours en SF) pour des discussions. Ce n'est pas un forum ou un forum de discussion, cf. FAQ.

+2

Alors avez-vous baissé toutes les autres réponses à cause de cela? En réalité, votre réponse aurait dû être postée ici dans le fil "original" et l'autre poste devrait être signalé comme doublon. – Matt

+0

J'ai fermé le duplicata, alors s'il vous plaît modifier ceci avec le texte de votre réponse réelle. –

+0

Merci cela semble intéressant. Je vais jeter un coup d'oeil dans ceci. Je n'ai pas considéré la «solution LIKE» en raison de l'efficacité. Je dois gérer des millions de textes et des millions de mots-clés. Merci. – cs0815

0

Essayez d'utiliser CONTAINS peut-être? Freetext fonctionne plus comme "LIKE".

+0

j'ai essayé contient et il a produit le même résultat – cs0815

-1

Je ne dispose pas d'un DB activé FTS mis en place pour tester, mais ont vous avez essayé quelque chose comme contains (data, 'world AND NOT' -world '')? Vous devrez peut-être chercher à modifier le mot-rupture.

+0

Je suppose que cela fonctionnerait mais je ne pourrais pas faire ceci pour n'importe quelle possibilité si vous voyez ce que je veux dire. A la fin de la journée je voudrais indexer du texte contre quelques mots EXCACT et tous. Jusqu'à présent, la recherche en texte intégral semble plutôt inutile, même pour des tâches aussi simples ... – cs0815

+0

Je ne sais pas ce que je pensais. Ajouter le NOT n'aura probablement aucun effet, et vous aurez certainement besoin de chercher à modifier le mot break ... SQL Server traite "j-world" comme deux mots différents "j" et "world". Donc, vous obtenez une correspondance exacte sur "monde". Lien MS: http://support.microsoft.com/kb/200043 et quelqu'un d'autre essayant de faire à peu près la même chose: http://stackoverflow.com/questions/1542708/how-to-change-word-break-characters -in-sql-server-full-text-indexing – joelt

Questions connexes