2009-05-06 8 views
4

Je me demandais simplement si nous pouvions atteindre certaines fonctionnalités de SGBDR dans Lucene.Utilisation de Lucene comme une base de données relationnelle

Exemple: 1) J'ai 10 000 documents de projet (fichiers pdf) qui doivent être indexés avec leur contenu pour les rendre disponibles pour la recherche. 2) Chaque document est lié à un projet unique. Le projet peut contenir des détails comme le nom du projet, le numéro, la date de début, la date de fin, l'emplacement, le type, etc.

Je dois rechercher dans le contenu des fichiers pdf pour un mot clé donné, mais en affichant les résultats je veux afficher les méta-données du projet comme indiqué au point (2).

Mon idée est d'associer un champ appelé projectId à chaque fichier pdf lors de l'indexation. Une fois que nous aurons cela, nous lancerons une nouvelle recherche pour obtenir les méta-données du projet.

De cette façon, nous pourrions éviter les données en double. En outre, si nous voulons mettre à jour les méta-données du projet, nous finirons par mettre à jour à un seul emplacement. Sinon, si nous stockons ces méta-données avec tous les index pdf, nous finaliserons la mise à jour de tous les documents, ce qui n'est pas ce que je recherche.

veuillez aviser.

+0

Essayez-vous d'éviter la réplication pour réduire la quantité d'espace occupé par les données en double? Ou essayez-vous d'éviter la logistique de la synchronisation de deux systèmes? –

Répondre

1

Si je comprends bien, vous avez deux questions:

  1. Puis-je stocker un identifiant de projet Lucene et de l'utiliser pour d'autres recherches? Oui, vous pouvez. C'est une pratique courante. Puis-je utiliser cet ID de projet pour rechercher des méta-données de projet dans Lucene? Oui, vous pouvez. Je ne sais pas si c'est une bonne idée. Cela dépend de la fréquence de vos mises à jour de métadonnées et de votre modèle d'accès. Si les métadonnées sont relativement statiques et que vous n'y accédez que par id, Lucene peut être un bon endroit pour les stocker. Sinon, vous pouvez utiliser l'ID de projet en tant que clé primaire d'une table de base de données, ce qui peut être mieux adapté.
+0

salut, tous les index seraient avec lucene seulement. il n'y aura pas de communication de base de données. mais la structure lucene serait comme ça. signifie 1) Indice directory1: aura des index pour les documents avec identifiant produit 2) Indice de directory2: aura des index pour ce produit méta-données contenant l'ID de produit l'idée principale derrière cela est de réduire la taille de l'index de Lucene. signifie que chacun de ces 10 000 documents aurait des méta-données de produit, ce qui est répété des données pour lesquelles je voulais faire un index de métadonnées produit unique qui serait appelé pour utiliser l'ID de produit dans l'index de document. –

+0

Fin. Vous pouvez prendre en charge les requêtes du type "me donner tous les documents ayant l'ID de produit nnn" ou "me donner des méta-données pour les ID de produit aaa, bbb". Vous pouvez même avoir une requête en deux étapes qui équivaut à "me donner toutes les méta-données pour les produits pertinents pour ces documents". C'est moins flexible qu'un SGBDR, mais cela semble suffisant pour votre cas d'utilisation. Si vous voulez des requêtes de plage, vous devrez peut-être remplir vos identifiants avec des zéros. –

1

Cela semble être une bonne chose à faire. La seule limitation que vous aurez (en stockant une référence au projet dans Lucene plutôt que les données du projet lui-même) est que vous ne serez pas en mesure d'interroger à la fois le texte du document et les métadonnées du projet en même temps. Par exemple, "documentText: foo OR projectName: bar". Si vous n'avez pas une telle exigence, il semble que stocker l'ID dans Lucene qui se réfère à une ligne de base de données est une bonne chose à faire.

0

Je ne suis pas sûr de votre configuration globale, mais peut-être Hibernate Search est pour vous. Cela vous permettrait de combiner les avantages d'une base de données relationnelle avec la puissance d'un moteur de recherche fulltext comme Lucene. Les métadonnées peuvent être stockées dans la base de données, peut-être avec les documents PDF d'origine, tandis que les documents Lucene ne contiennent que les données interrogeables.

1

Ceci est certainement possible. Mais soyez toujours conscient du fait que vous utilisez Lucene pour quelque chose pour lequel il n'était pas destiné. En général, Lucene est conçu pour la recherche en texte intégral, pas pour le mappage de contenu relationnel. Ainsi, plus votre contenu relationnel devient complexe, plus vous constaterez une baisse des performances.

En particulier, il y a quelques zones à garder un œil sur:

  • stockage de la valeur de chaque champ dans l'index diminuera les performances. Si vous n'êtes pas trop préoccupé par les résultats de recherche inférieurs à la seconde, ou si votre index est relativement petit, cela peut ne pas poser de problème.Sachez également que si vous n'utilisez pas l'algorithme de classement par défaut et que votre algorithme personnalisé nécessite des informations sur le projet pour calculer le score de chaque document, cela aura un impact considérable sur les performances de recherche, car bien.

Si vous avez besoin d'un index plus puissant qui a été conçu pour le contenu relationnel, il existe des outils d'indexation hiérarchiques là-bas (celui développé par Apache, appelé Jackrabbit) qui sont dignes d'intérêt. Comme votre projet ne cesse de croître, vous pouvez également consulter Solr, également développé par Apache, qui fournit des fonctionnalités supplémentaires, telles que la recherche multi-facettes.

1

Vous pouvez utiliser Lucene de cette façon;

Plus:

recherche plein texte est facile à mettre en œuvre, ce qui est le cas dans un SGBDR.

Moins:

intégrité référentielle: vous obtenez gratuitement dans un SGBDR, mais Lucene, vous devez mettre en œuvre vous-même.

+0

Je ne suis pas familier avec Lucene non plus, mais selon http://stackoverflow.com/questions/1296709/getting-the-doc-id-in-lucene/1296943#1296943 il semble utiliser "document id" comme une clé étrangère est également un problème que l'utilisateur doit prendre en charge. –

+0

D'accord: l'intégrité référentielle est un problème. – pvoosten

Questions connexes