Question

Quelqu'un a-t-il utilisé Lucene.NET plutôt que d'utiliser la recherche en texte intégral fournie avec le serveur SQL ?

Si c'est le cas, je serais intéressé de savoir comment vous l'avez mis en œuvre.

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

Était-ce utile?

La solution

Oui, je l'ai utilisé exactement pour ce que vous décrivez.Nous avions deux services : un pour la lecture et un pour l'écriture, mais uniquement parce que nous avions plusieurs lecteurs.Je suis sûr que nous aurions pu le faire avec un seul service (l'écrivain) et intégrer le lecteur dans l'application Web et les services.

J'ai utilisé lucene.net comme indexeur de base de données général, donc ce que j'ai récupéré était essentiellement des identifiants de base de données (pour indexer les messages électroniques), et je l'ai également utilisé pour récupérer suffisamment d'informations pour remplir les résultats de recherche ou autres sans toucher au base de données.Cela a très bien fonctionné dans les deux cas, même si le SQL peut devenir un peu lent, car vous devez pratiquement obtenir un identifiant, sélectionner un identifiant, etc.Nous avons contourné ce problème en créant une table temporaire (contenant uniquement la ligne d'ID) et en l'insérant en bloc à partir d'un fichier (qui était la sortie de Lucene), puis en nous joignant à la table des messages.C'était beaucoup plus rapide.

Lucene n'est pas parfait, et vous devez sortir un peu du cadre de la base de données relationnelle, car ce n'en est PAS TOTALEMENT une, mais il est très très bon dans ce qu'il fait.Cela vaut le détour et, me dit-on, il n'a pas les problèmes "oups, désolé, vous devez reconstruire votre index à nouveau" que pose le FTI de MS SQL.

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

Les performances étaient pour le moins fantastiques - assurez-vous simplement de réfléchir et de modifier vos facteurs de fusion (lors de la fusion des 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 contenant chacun des éléments de 1 million, et que vous avez un fil d'observation qui tue le processus si cela prend trop de temps... ..(oui, ça nous a botté le cul pendant un moment).Gardez donc le nombre maximum de documents par truc FAIBLE (c'est-à-dire, ne le réglez pas sur maxint comme nous l'avons fait !)

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

Autres conseils

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

Si vous souhaitez rechercher une base de données et pouvez choisir d'utiliser Lucene, je suppose également que vous pouvez contrôler le moment où les données sont insérées dans la base de données.Si tel est le cas, il n'y a aucune raison d'interroger la base de données pour savoir si vous devez réindexer, indexez simplement au fur et à mesure de l'insertion ou créez une table de file d'attente qui peut être utilisée pour indiquer à Lucene quoi indexer.

Je pense que nous n'avons pas besoin d'un autre indexeur qui ignore ce qu'il fait et qui réindexe à chaque fois, ou qui gaspille des ressources.

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'une base de données, c'est juste 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 tous les détails sont affichés à partir de l'index Lucene et la base de données est uniquement utilisée à des fins d'édition.Cette configuration s’est avérée être une solution très évolutive pour nos besoins.

Concernant les différences entre SQL Server et Lucene, le principal problème avec la recherche en texte intégral de SQL Server 2005 est que le service est découplé du moteur relationnel, donc les jointures, les commandes, les agrégats et les filtres entre les résultats en 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 en texte intégral dans le moteur relationnel, mais je ne l'ai pas testé.Ils ont également rendu l'ensemble de la recherche en texte intégral beaucoup plus transparente. Dans les versions précédentes, les stemmers, les mots vides et plusieurs autres parties de l'indexation ressemblaient à une boîte noire et étaient difficiles à comprendre, et dans la nouvelle version, il est plus facile de voir comment ils fonctionnent.

D'après mon expérience, si le serveur SQL répond à vos exigences, ce sera le moyen le plus simple. Si vous vous attendez à beaucoup de croissance, à des requêtes complexes ou si vous avez besoin d'un grand contrôle de la recherche en texte intégral, vous pourriez envisager de travailler avec Lucene dès le début car il sera plus facile à adapter et à personnaliser.

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

  • Enregistrement du magasin :

    insérer du texte, d'autres données dans le tableau
    obtenir le dernier identifiant inséré
    créer un document Lucene
    mettre (id, text) dans le document lucene met à jour index lucene

  • Interrogation
    recherche 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 ID d'enregistrement stocké

Juste pour noter, je suis passé de Lucene à Sphinx grâce à ses superbes performances

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top