2009-09-24 7 views
4

Je voudrais implémenter une fonctionnalité de filtre/recherche dans mon application en utilisant Lucene.Java: de Lucene Hits à des objets originaux

L'interrogation de l'index Lucene me donne une instance Hits, ce qui n'est rien de plus qu'une liste de Document s correspondant à mes critères.

Depuis que je génère le Document s indexé de mes objets, quel est le meilleur moyen de trouver l'objet original lié à un Lucene spécifique Document?


Une meilleure description de ma situation:

  • Trois classes de modèle pour le moment: Folder (peut avoir d'autres Folder s ou List s les enfants), List (peut avoir Task s les enfants) et Task (peut avoir d'autres Task s comme enfants). Ils sont tous DefaultMutableTreeNode sous-classes. Je vais ajouter l'entité Tag dans le futur .
  • Chaque Task a un texte, une date de début, une date d'échéance, des drapeaux booléens. Ils sont affichés dans un JTree.
  • L'arbre de trous est enregistré dans un fichier XML.
  • Je voudrais faire des choses comme celles-ci:
  • recherche Task s avec des requêtes de type Google. Tous les Task s qui commencent aujourd'hui.
  • Filtre Task s par Tag.
+0

De vos commentaires, je pense que je comprends un peu mieux ce que vous faites. Pouvez-vous décrire les champs que vous avez "indexés" avec Lucene? Pouvez-vous décrire l'interface utilisateur que vous fournissez un peu plus? Je suppose que vous avez un arbre affiché, mais qu'en entrant du texte dans un champ, l'utilisateur peut obtenir une liste de nœuds feuille qui ont une certaine correspondance dans leur étiquette. Est-ce exact? Les matchs doivent-ils être exacts? Utilisez-vous les fonctionnalités de Lucene comme stemming et tokenization? – erickson

Répondre

3

Vous ne pouvez pas, avec vanille Lucene. Vous avez dit vous-même que vous avez converti vos objets en Documents puis stocké les Documents dans Lucene, comment imagineriez-vous que ce processus serait réversible?

Si vous voulez stocker et récupérer vos propres objets dans Lucene, je recommande fortement que vous utilisez à la place Compass. Compass est à Lucene ce que Hibernate est à JDBC - vous définissez un mappage entre vos objets et les documents Lucene, Compass s'occupe de la conversion.

+0

Hibernate Search est à la recherche d'information ce que Hibernate est aux bases de données relationnelles. Je n'ai pas examiné Hibernate Search en profondeur, mais j'ai regardé Compass, et je crois qu'il a fait une erreur de conception fondamentale en implémentant un 'Directory' basé sur JDBC au lieu d'un' IndexReader'. Je décourage vraiment l'utilisation de Compass. – erickson

+0

Compass peut utiliser n'importe quel répertoire Lucene que vous choisissez, celui basé sur JDBC n'est qu'une option. Vous pouvez également utiliser les répertoires RAM et les répertoires FileSystem. Si c'est la base sur laquelle vous avez recommandé contre Compass, vous l'avez fait sur la mauvaise information. – skaffman

+0

Et Hibernate Search est pour l'indexation des bases de données Hibernate, ce n'est * pas * un mécanisme général d'indexation. Lucene (et Compass) sont. – skaffman

3

ajouter un champ « stockée » qui contient un identificateur d'objet. Pour chaque hit, recherchez l'objet original via l'identifiant.

Sans le savoir plus de contexte, il est difficile d'être plus précis.

+0

Oui, c'est le moyen facile de le faire. Je suppose que vous pourriez sérialiser vos objets dans des documents, puis les recréer, mais cela ressemble à un mauvais design. –

+0

Puisque mes objets sont stockés dans un arbre, je devrais marcher dans l'arbre des trous pour trouver l'objet que je cherche. Cela rendrait Lucene inutile. – Giuseppe

+0

à peine. Lucene est un système de recherche d'information. Ses structures de données sont différentes de celles utilisées pour rechercher efficacement un enregistrement par clé. Je ne suis pas sûr du type de "Tree" dont vous parlez, mais si vous voulez dire "java.util.TreeMap", plutôt que de parcourir tout l'arbre, vous obtiendrez une recherche O (log n) (ou O (1) recherche, si vous passez à un 'HashMap'). Histoire similaire si vous utilisez un arbre B sur le disque. Lucene propose de nombreuses fonctionnalités qui ne sont pas disponibles à partir d'un simple arbre: tokenisation, stemming, classement de pertinence, etc. Peut-être que vous utilisez incorrectement l'un ou l'autre si la différence n'est pas apparente. – erickson