4 votes

Utilisation de Lucene pour interroger une base de données SGBDR

J'ai parcouru les documents relatifs à la version Java de Lucene, mais je ne vois pas vraiment l'information de haut niveau "comment ça marche" jusqu'à présent (je suis conscient que je dois faire du RTFM, mais je n'arrive pas à voir le bois pour les arbres).

Je comprends que Lucene utilise des index de recherche pour retourner les résultats. Pour autant que je sache, il ne renvoie que les "hits" de ces index. Si je n'ai pas ajouté un élément de données lors de la construction de l'index, il ne sera pas retourné.

C'est bien, alors maintenant je veux vérifier l'hypothèse suivante :

Q : Cela signifie-t-il que toutes les données que je veux afficher sur une page de recherche doivent être ajoutées à l'index Lucene ?

I.e.
Si je veux rechercher Product par des éléments tels que le numéro de référence, la description, le nom de la catégorie, etc. Customer qu'ils appartiennent dans les résultats de recherche, n'est-ce pas ?

  1. Assurez-vous que l'index Lucene contient l'information dénormalisée. Customer dans l'index.
  2. Utilisez les occurrences renvoyées par Lucene pour interroger la base de données afin de trouver les enregistrements de produits réels et utilisez un fichier de type JOIN pour obtenir le Customer Le nom de l'entreprise.

Je suppose que c'est une option 1 Je suppose qu'il n'y a pas de moyen de "joindre" les résultats d'une requête Lucene à un SGBDR, mais je voulais savoir si mes hypothèses sur l'utilisation générale étaient correctes.

1voto

BrokenGlass Points 91618

En général, l'index ne contient que les champs sur lesquels vous voulez effectuer une recherche, et pas nécessairement ceux que vous voulez afficher. Les index doivent être optimisés pour être aussi petits que possible, afin de maintenir de bonnes performances de recherche.

Pour pouvoir afficher davantage de données, ajoutez un champ à votre index qui vous permet de récupérer votre document/données complet(e), c'est-à-dire une clé unique pour votre fichier de données. Product (identifiant du produit ?).

1voto

Arshad Ansari Points 131

J'ai essayé de résoudre le même problème, mais je pense que c'est trop de travail. Je pense à ceci comme alternative. Corrigez-moi si je me trompe !

Votre situation est la suivante : Produit SGBDR (nombreux) <------> (nombreux) Client

Au lieu de mettre seulement le client dans l'index lucène pour obtenir les clés du produit, et ensuite interroger le SGBDR avec IN Query, je suggère de créer l'index lucène avec le produit cartésien du produit ainsi que du client.

Comme client_1, produit_1 client_1, produit_2 client_2, produit_2..

De cette façon, lorsque vous recherchez un produit dans Lucene, il donnera à la fois le client et l'identifiant du produit et au lieu de les joindre dans le SGBDR, vous pouvez simplement rechercher ces clients et ces produits pour plus d'informations dans le SGBDR, si nécessaire. Si vous utilisez la mise en cache, le coût de la recherche de détails supplémentaires diminuera également.

0voto

Neil Barnwell Points 20731

Sur la base de La réponse de BrokenGlass J'ai réfléchi un peu plus et je propose ce qui suit pour voir si je suis sur la bonne voie :

En fait, en poussant plus loin l'option 2, on pourrait faire ce qui suit :

  1. Placez uniquement les données sur lesquelles vous souhaitez effectuer une recherche dans l'index Lucene, ainsi qu'une sorte de valeur clé (par exemple, le PK d'une table dans votre base de données).
  2. Interroger Lucene pour obtenir une liste de résultats.
  3. En utilisant la couche d'accès aux données de votre choix, construisez une requête pour votre base de données qui inclut une IN (value [, value]) prédicat.
  4. Obtenez les résultats de cette requête à partir de votre base de données (qui peut inclure les éléments suivants JOIN à d'autres tables).
  5. Placez ces résultats dans un dictionnaire, en utilisant le PK du jeu de résultats comme clé.
  6. Interrogez à nouveau les occurrences Lucene dans l'ordre, en extrayant les éléments du dictionnaire à l'aide de la PK afin de construire une liste de résultats dans l'ordre dans lequel Lucene a renvoyé les occurrences (c'est-à-dire triée par pertinence).
  7. Affichez cette liste de résultats "triés" à l'utilisateur.

Bien sûr, les étapes 5 et 6 pourraient être meilleures, mais pour le bien de l'explication, j'ai mis cette méthode verbeuse dans ma description. Si les occurrences Lucene incluent une sorte de valeur de "pertinence", vous pourriez l'attribuer au jeu de résultats et effectuer un tri standard, mais c'est un exercice pour le lecteur :)

Est-ce que ça pourrait être ça ?

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