2010-10-19 10 views
1

Je viens de recevoir une liste d'exigences pour une nouvelle fonction de recherche pour nos sites Web. Ce sont les sites Web des éditeurs de livres, c'est donc le domaine de base dans lequel nous travaillons ici. Les données sont stockées dans un serveur de base de données Microsoft SQL 2005 (SP3) avec fulltext activé. Maintenant, les exigences stipulent que la recherche peut être effectuée dans trois domaines: titre du livre, noms d'auteur et textes du livre. Cela en soi est assez facile à faire avec trois requêtes distinctes. Cependant, il y a plus. Les exigences stipulent que les résultats de la recherche devraient revenir à peu près l'ordre suivant:Moteur de recherche de la base de données - Trier par pertinence selon les règles de pertinence spécifiques

  • Titre complet correspond
  • nom de l'auteur complet correspond
  • titre partiel correspond
  • auteur lastname correspond à la pleine
  • auteur partielle matches lastname
  • Auteur partiel Le nom complet correspond à
  • Correspondances du texte du livre

De plus, il y a des exigences secondaires:

  • Les titres de l'éditeur lui-même doivent être commandés plus élevé que celui d'un éditeur voisin (il y a des livres d'une douzaine d'éditeurs dans la même base de données)
  • Lorsque un match complet pour un titre est trouvé, d'autres livres du même auteur devraient être affichés (avec encore les titres du même éditeur primant sur l'autre - un auteur peut publier avec plusieurs éditeurs)

Beaucoup de règles comme ça. Donc, disons que vous avez un livre Johnson, écrit par un auteur Pete Johnson (ou autre). La requête de recherche 'john' doit alors retourner le suivant (ish):

  • Johnson (livre) (match titre partiel)
  • Pete Johnson (match lastname partiel)

Et la requête de recherche 'Johnson':

  • Johnson (livre) (titre du match)
  • Johnson (livre) (match titre partiel) (omis, déjà dans les résultats)
  • Pete Johnson (auteur) (match lastname complet auteur)
  • Pete Johnson (auteur) (match partiel auteur lastname) (omis)
  • Pete Johnson (auteur) (match partiel auteur fullname) (omis)
  • Johnson (livre) (correspondance du texte du livre) (omis)

... Quoi qu'il en soit. C'est essentiellement les exigences, et je voulais juste taper cela.Maintenant, pour quelques questions:

  • Y at-il des livres ou des articles sur ce sujet particulier que vous pourriez me montrer?
  • Comment cela serait-il mieux implémenté? Cela peut-il être fait dans un ensemble de requêtes de base (requêtes séparées pour chaque exigence de recherche, post-traitement pour supprimer les doublons et fusionner les résultats), ou peut-il être fait dans une seule requête?
  • Ou ai-je besoin d'écrire une application qui indexe la table et crée ses propres index et autres, que la recherche interroge à son tour?

Je suis un peu à la recherche d'idées et de suggestions ici.

Répondre

1

Il existe CONTAINSTABLE et FREETEXTTABLE fonctions - ils retournent la colonne RANK qui est "classement de pertinence". Probablement ces fonctions, plus un ordre complexe par des colonnes non-texte feront l'affaire.

Si vous décidez d'implémenter FTS dans votre application, jetez un œil aux solutions tierces. Lucene (ou Lucene.NET) est probablement bon pour commencer.