2008-11-25 9 views
6

Depuis quelques heures, je suis en train de jouer avec toutes sortes de variations de la recherche en texte intégral de SQL Server. Cependant, je suis toujours incapable de comprendre comment fonctionne le classement. J'ai rencontré quelques exemples qui me rendent vraiment confus quant à la façon dont ils se classent plus haut que d'autres. Par exempleClassement de la recherche de texte intégral (SQL Server)

J'ai une table avec 5 cols + plus qui ne sont pas indexés. Tous les champs sont nvarchar.

Je cours cette requête (enfin presque .. Je retapé avec des noms différents)

SET @SearchString = REPLACE(@Name, ' ', '*" OR "') --Splits words with an OR between 
SET @SearchString = '"'[email protected]+'*"' 
print @SearchString; 

SELECT ms.ID, ms.Lastname, ms.DateOfBirth, ms.Aka, ms.Key_TBL.RANK, ms.MiddleName, ms.Firstname 
FROM View_MemberSearch as ms 
INNER JOIN CONTAINSTABLE(View_MemberSearch, (ms.LastName, ms.Firstname, ms.MiddleName, ms.Aka, ms.DateOfBirth), @SearchString) AS KEY_TBL 
    ON ms.ID = KEY_TBL.[KEY] 
WHERE KEY_TBL.RANK > 0 
ORDER BY KEY_TBL.RANK DESC; 

Ainsi, si je recherche 05/11/1964 JOHN JACKSON je recevrais « 11/05/1964" OU "JOHN *" ou "JACKSON *" et ces résultats:

ID -- First Name -- Middle Name -- Last Name -- AKA -- Date of Birth -- SQL Server RANK 
---------------------------------------------------------------------------------- 
1 | DAVE  | JOHN  | MATHIS  | NULL | 11/23/1965 | 192 
2 | MARK  | JACKSON  | GREEN  | NULL | 05/29/1998 | 192 
3 | JOHN  | NULL  | JACKSON | NULL | 11/05/1964 | 176 
4 | JOE  | NULL  | JACKSON | NULL | 10/04/1994 | 176 

Alors enfin ma question. Je ne vois pas comment les rangées 1 et 2 sont rangées au-dessus de la rangée 3 et pourquoi la rangée 3 est classée comme la rangée 4. La rangée 2 devrait avoir le rang le plus élevé vu que la chaîne de recherche correspond au prénom et au nom comme la date de naissance.

Si je change le OU en ET je n'obtiens aucun résultat. Que se passe-t-il si vous supprimez les critères DoB?

Répondre

6

J'ai trouvé AND et OR clauses n » t appliquer sur les colonnes. Créez une vue indexée qui fusionne les colonnes et vous obtiendrez de meilleurs résultats. Regardez mes questions passées et vous trouverez des informations qui suivent votre scénario.

J'ai aussi trouvé que je ferais mieux de ne pas ajouter un '*'. Je pensais que cela donnerait plus de résultats, mais cela avait tendance à retourner des résultats plus mauvais (en particulier pour les mots longs). En tant que terrain d'entente, vous pouvez seulement ajouter un * à des mots plus longs.

Le cas d'exemple que vous donnez est vraiment bizarre.

+0

comment fusionner les colonnes et utiliser exactement?J'ai le même problème. – zsharp

+0

Est-il préférable d'avoir une colonne calculée et d'avoir un index de texte complet sur cette colonne que d'avoir à chercher sur des colonnes séparées? – user636525

1

MS Recherche en texte intégral est vraiment vraiment une boîte noire qui est difficile à comprendre et à personnaliser Vous à peu près le prendre en l'état, à la différence Lucene est grande pour la personnalisation

1

Merci les gars. Frank vous aviez raison que ET et OU ne pas traverser les colonnes c'était quelque chose que je n'ai pas remarqué au début.

Pour obtenir les meilleurs résultats, j'ai dû fusionner toutes les 5 colonnes en 1 colonne dans une vue. Puis recherchez sur cette seule colonne. Cela m'a donné les résultats exacts que je voulais sans extras.

Ma chaîne de recherche réelle après l'avoir converti a fini par être « Mot1 * » ET « mot2 * »

Utilisation du signe% n'a toujours pas fait ce msdn a dit qu'il devrait faire. Ce qui veut dire que si je cherchais le mot josh et que ça changeait en "Josh%" quand je cherchais, alors "Joshua" ne serait pas trouvé. Assez bête cependant avec "Josh *" alors joshua serait trouvé.

Questions connexes