60 votes

Configurer Lucene.Net avec SQL Server

Est-ce que quelqu'un a utilisé Lucene.NET plutôt que d'utiliser la recherche de texte intégrale fournie avec SQL Server?

Si c'est le cas, je serais intéressé de savoir comment vous l'avez implémenté.

Avez-vous par exemple écrit un service Windows qui interrogeait la base de données toutes les heures, puis sauvegardait les résultats dans l'index Lucene.NET?

59voto

Nic Wise Points 4722

Oui, je l'ai utilisé exactement pour ce que tu décris. Nous avions deux services - un pour la lecture, et un pour l'écriture, mais seulement parce que nous avions de multiples lecteurs. Je suis sûr que nous aurions pu le faire avec un seul service (le rédacteur) et intégrer le lecteur dans l'application web et les services.

J'ai utilisé lucene.net comme un indexeur de base de données générale, donc ce que je récupérais était essentiellement des ID de base de données (pour les messages email indexés), et je l'ai également utilisé pour récupérer suffisamment d'informations pour remplir les résultats de recherche ou similaires sans toucher à la base de données. Ça a très bien fonctionné dans les deux cas, même si le SQL peut être un peu lent, car vous devez pratiquement obtenir un ID, sélectionner un ID, etc. Nous avons contourné cela en créant une table temporaire (avec seulement la ligne ID dedans) et en insérant en masse à partir d'un fichier (qui était la sortie de lucene) puis en le joignant à la table des messages. Ça été beaucoup plus rapide.

Lucene n'est pas parfait, et vous devez penser un peu en dehors de la boîte de la base de données relationnelle, car ce n'en est TOTALEMENT pas une, mais il est très très bon dans ce qu'il fait. Ça vaut le coup d'œil, et, on m'a dit, qu'il n'a pas les problèmes de "oups, désolé, vous devez reconstruire votre index à nouveau" que MS SQL FTI a.

BTW, nous avions affaire à 20-50 millions d'emails (et environ 1 million de pièces jointes uniques), totalisant environ 20 Go d'index lucene je pense, et 250+ Go de base de données SQL + pièces jointes.

La performance était fantastique, pour le moins - assurez-vous juste de penser à, et ajuster, vos facteurs de fusion (lorsqu'il fusionne les segments d'index). Il n'y a aucun problème à avoir plus d'un segment, mais il peut y avoir un GROS problème si vous essayez de fusionner deux segments qui ont 1 million d'éléments dans chaque, et que vous avez un thread observateur qui arrête le processus s'il prend trop de temps..... (oui, cela nous a donné du fil à retordre pendant un certain temps). Donc gardez le nombre maximal de documents par truc BAS (c'est-à-dire, ne le réglez pas à maxint comme nous l'avons fait!)

EDIT Corey Trager a documenté comment utiliser Lucene.NET dans BugTracker.NET ici.

1 votes

J'ai également ajouté la prise en charge de l'indexation en texte intégral à la bibliothèque Simple Savant pour Amazon SimpleDB en utilisant Lucene.NET. L'architecture est décrite ici : simplesavant.codeplex.com/…

3voto

neslekkiM Points 416

Je ne l'ai pas encore fait contre la base de données, votre question est plutôt ouverte.

Si vous voulez rechercher une base de données, et que vous pouvez choisir d'utiliser Lucene, je suppose aussi que vous pouvez contrôler quand les données sont insérées dans la base de données. Si tel est le cas, il y a peu de raison de consulter la base de données pour savoir si vous devez réindexer, il vous suffit d'indexer au fur et à mesure de l'insertion, ou de créer une table de files d'attente qui peut être utilisée pour dire à lucene ce qu'il faut indexer.

Je pense que nous n'avons pas besoin d'un autre indexeur qui est ignorant de ce qu'il fait, et qui réindexe à chaque fois, ou qui utilise des ressources de manière inefficace.

2voto

Jokin Points 1809

J'ai également utilisé lucene.net comme moteur de stockage, car il est plus facile de distribuer et de configurer des machines alternatives avec un index qu'avec une base de données, c'est simplement une copie du système de fichiers, vous pouvez indexer sur une machine, et simplement copier les nouveaux fichiers sur les autres machines pour distribuer l'index. Toutes les recherches et détails sont affichés à partir de l'index lucene, et la base de données est simplement utilisée pour l'édition. Cette configuration s'est avérée être une solution très évolutive pour nos besoins.

En ce qui concerne les différences entre SQL Server et Lucene, le principal problème de la recherche de texte intégrale de SQL Server 2005 est que le service est dissocié du moteur relationnel, donc les jointures, les ordres, les agrégats et les filtres entre les résultats de recherche de texte intégral et les colonnes relationnelles sont très coûteux en termes de performances, Microsoft affirme que ces problèmes ont été résolus dans SQL Server 2008, en intégrant la recherche de texte intégral à l'intérieur du moteur relationnel, mais je ne l'ai pas testé. Ils ont également rendu l'ensemble de la recherche de texte intégral beaucoup plus transparent, dans les versions précédentes les stemmers, les stopwords, et plusieurs autres parties de l'indexation étaient comme une boîte noire et difficiles à comprendre, et dans la nouvelle version il est plus facile de voir comment ils fonctionnent.

Avec mon expérience, si SQL Server répond à vos besoins, ce sera le moyen le plus simple, si vous prévoyez une croissance importante, des requêtes complexes ou avez besoin d'un grand contrôle de la recherche de texte intégral, vous devriez envisager de travailler avec Lucene dès le départ car il sera plus facile à mettre à l'échelle et à personnaliser.

1voto

Espo Points 24318

Je pense que cet article est un bon point de départ :

http://www.aspfree.com/c/a/braindump/working-with-lucene-net/

1voto

aku Points 54867

J'ai utilisé Lucene.NET avec MySQL. Ma méthode consistait à stocker la clé primaire de l'enregistrement de la base de données dans le document Lucene en plus du texte indexé. En pseudo-code, cela ressemble à :

  • Stockage d'enregistrement :

    insérer du texte, d'autres données dans la table
    obtenir le dernier ID inséré
    créer un document lucene
    mettre (ID, texte) dans le document lucene mettre à jour l'index Lucene

  • Requête
    rechercher dans l'index Lucene
    pour chaque document lucene dans l'ensemble de résultats, charger les données de la base de données par l'ID de l'enregistrement stocké

Juste pour noter, j'ai changé de Lucene à Sphinx en raison de ses performances exceptionnelles

0 votes

Avec cette implémentation, comment gérez-vous les mises à jour des données ? Supprimez-vous et recréez-vous un fichier pour l'index Lucene ? Planifiez-vous la réindexation ou est-ce en temps réel ? Je pose ces questions dans l'espoir de mieux comprendre si je devrais l'utiliser ou non. Merci, deadbug.

0 votes

@deadbug, mon système était orienté lecture-intensive, j'ai supprimé d'anciens documents lucene et ajouté de nouveaux. J'ai expérimenté avec la planification, mais j'ai décidé de garder le système simple. Il n'y avait aucun problème de performance avec cette approche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X