J'ai une table SQL Server et j'essaie de donner un sens à la search fulltext 🙂
J'ai mis en place un catalogue fulltext et un index fulltext sur une table Entry
, qui contient entre autres une colonne VARCHAR(20)
appelée VPN-ID
.
Il y a environ 200 000 lignes dans cette table et la colonne VPN-ID
contient des valeurs telles que:
VPN-000-359-90 VPN-000-363-85 VPN-000-362-07 VPN-000-362-91 VPN-000-355-55 VPN-000-368-36 VPN-000-356-90
Maintenant, j'essaie de find des lignes dans cette table avec une search en text intégral.
Quand je fais
SELECT (list of columns) FROM dbo.Entry WHERE CONTAINS(*, 'VPN-000-362-07')
tout va bien et dandy et mes rangs sont returnnés.
Quand je commence à chercher avec un caractère générique comme ceci:
SELECT (list of columns) FROM dbo.Entry WHERE CONTAINS(*, 'VPN-000-362-%')
Je reçois des résultats et tout semble bien.
TOUTEFOIS: quand je cherche comme ceci:
SELECT (list of columns) FROM dbo.Entry WHERE CONTAINS(*, 'VPN-000-36%')
soudain, je n'obtiens aucun résultat … même s'il y a clairement des lignes qui correspondent à ce critère de search …
Des idées pourquoi ?? Quelles autres «sursockets» la search fulltext pourrait-elle me réserver? 🙂
Mise à jour: pour créer mon catalogue de text intégral, j'ai utilisé:
CREATE FULLTEXT CATALOG MyCatalog WITH ACCENT_SENSITIVITY = OFF
et pour créer l'index de text intégral sur ma table, j'ai utilisé
CREATE FULLTEXT INDEX ON dbo.Entry(list of columns) KEY INDEX PK_Entry
J'ai essayé d'éviter autant que possible les options "bizarres".
Mise à jour # 2: après un peu plus d'enquête, il semble que la search SQL Server Fulltext interprète en quelque sorte mes tirets à l'intérieur des strings comme des séparateurs ….
Alors que cette requête ne returnne rien:
SELECT (list of columns) FROM dbo.Entry WHERE CONTAINS(*, '"VPN-000-362*"')
celui-ci fait (fractionnement du terme de search sur les tirets):
SELECT (list of columns) FROM dbo.Entry WHERE CONTAINS(*, ' "VPN" AND "000" AND "362*"')
OK – semble un peu étrange qu'un tiret semble entraîner un fractionnement qui en quelque sorte ne fonctionne pas …..
Quelle Language for Word Breaker
utilisez-vous? Avez-vous essayé Neutral
?
MODIFIER:
De plus, vous devez utiliser WHERE CONTAINS([Column], '"text*"')
. Voir MSDN pour plus d'informations sur les searchs de préfixes :
C. Utilisation de CONTAINS avec
L'exemple suivant renvoie tous les noms de produits avec au less un mot commençant par la string de préfixe dans la colonne Nom.
USE AdventureWorks2008R2; GO SELECT Name FROM Production.Product WHERE CONTAINS(Name, ' "Chain*" '); GO
btw … question similaire ici et ici
Je me demandais juste, mais pourquoi ne faites-vous pas ceci:
SELECT (list of columns) FROM dbo.Entry WHERE [VPN-ID] LIKE 'VPN-000-36%'
Il me semble que la search de text intégral n'est pas le bon outil pour le travail. Utilisez simplement un index normal sur cette colonne.