2010-06-06 20 views
1

J'utilise Hibernate. Je suis à la recherche d'un moteur de texte gratuit. Avant d'enquêter sur ce sujet, j'ai besoin de votre expérience.Can Hibernate Résultats de limite de recherche par l'accessibilité de l'utilisateur?

J'ai dans mes applications utilisateur, rôle et table d'objets. Lorsqu'un utilisateur est connecté à un ou plusieurs rôles et qu'un rôle est connecté à un ou plusieurs objets.

Dans ma recherche de texte libre, l'utilisateur peut accéder uniquement aux données qu'il est autorisé à regarder par table d'objets.

Est-ce que Hibernate search peut m'aider avec?

Répondre

2

Check this out:

http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Filter.html

Je pense que c'est la bonne façon de mettre en œuvre ce que vous voulez. Je ne sais pas vraiment comment cela est intégré dans hibernate-search, mais j'espère qu'il existe un moyen d'ajouter un filtre à une requête d'une manière ou d'une autre.

modifier plus tard:

il semble qu'il y ait:

http://docs.jboss.org/hibernate/stable/search/reference/en/html/search-query.html#query-filter

0

Ce sont deux problèmes distincts:

  • restriction dont le contenu d'un utilisateur peut effectuer des recherches dans
  • recherche en fait le contenu

Alors que pour le deuxième problème, vous pouvez facilement utiliser Mise en veille prolongée Recherche (c'est juste Apache Lucene avec un peu d'intégration), pour le premier vous devriez vous concentrer sur la sélection du bon contenu vouloir chercher avant de le chercher avec lucene.

+0

donc c'était ma question - comment puis-je les combiner d'une manière indexée? puisque je ne veux pas créer une requête en utilisant où pour chaque rôle! et je ne veux pas apporter Je dois créer un index pour les données sécurisées .. – Dejell

+0

Je pense que vous pouvez les filtrer en restreignant l'entité sur laquelle vous ferez votre recherche .. – Jack

4

Sur la base de ce que vous avez décrit votre modèle pour ressembler, Hibernate Search sera en mesure de vous donner ce que vous avez besoin tout à fait facilement.

Il semble que vous recherchiez une combinaison d'un index incorporé et d'un filtre. Je suppose que vous avez une relation de plusieurs à plusieurs entre l'objet et le rôle. Si oui, vous avez probablement quelque chose comme ça dans l'objet:

@ManyToMany 
@JoinTable(name = "object_role", 
      joinColumns = @JoinColumn(name = "object_id"), 
      inverseJoinColumns = @JoinColumn(name = "role_id")) 
private Set<Role> roles = new HashSet<Role>(); 

Pour prendre les rôles et les intégrer dans le cadre de l'index créé pour objet, vous devez simplement mettre au-dessus @IndexedEmbedded(prefix = "somPrefixName")@ManyToMany.

Vous pouvez ensuite définir un filtre en utilisant @FullTextFilterDef qui examine cet index incorporé et filtre un rôle donné (qui serait probablement le rôle de l'utilisateur qui exécute la recherche). Cela garantira que seuls les objets liés au rôle donné sont renvoyés par la requête de recherche.

En bref, Hibernate Search sera en mesure de fournir ce dont vous avez besoin (en supposant que je comprends correctement vos besoins). Je serai heureux de donner plus de détails sur comment si vous le souhaitez.

0

Pour limiter les utilisateurs à certaines données uniquement, je suppose que vos données seront mappées sur des rôles accessibles.Si c'est le cas, vous devez également indexer votre objet rôle. Utilisez ensuite l'annotation @IndexedEmbedded avec l'association un-à-plusieurs ou un-à-un.

Ensuite, vous pouvez construire votre requête comme: « texte: + input.getSearchText() + "+ role.roleText:" + currentUser.getRole();

Cela peut fonctionner ou non en fonction de la