Может ли поиск в Hibernate ограничивать результаты доступностью пользователя? - PullRequest
1 голос
/ 06 июня 2010

Я использую Hibernate. Я ищу бесплатный текстовый движок.

Прежде чем я начну расследовать это, мне нужен ваш опыт.

В моих приложениях есть таблица пользователей, ролей и объектов. Когда пользователь связан с одной или несколькими ролями, а роль связана с одним или несколькими объектами.

В моем свободном текстовом поиске пользователь может получить доступ только к тем данным, которые ему разрешено просматривать по таблице объектов.

Может ли поиск в Hibernate помочь мне с этим?

Ответы [ 4 ]

5 голосов
/ 10 февраля 2011

Исходя из того, как вы описали свою модель, Hibernate Search сможет дать вам то, что вам нужно, довольно легко.

Похоже, вы ищете комбинацию встроенного индекса и фильтра. Я предполагаю, что у вас есть много-много отношений между объектом и ролью. Если это так, вы, вероятно, имеете что-то подобное в Object:

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

Чтобы взять роли и встроить их в состав индекса, созданного для объекта, вам нужно просто поставить @IndexedEmbedded(prefix = "somPrefixName") над @ManyToMany.

Затем вы можете определить фильтр, используя @FullTextFilterDef, который просматривает этот встроенный индекс и фильтрует по заданной роли (которая, вероятно, будет ролью пользователя, выполняющего поиск). Это гарантирует, что поисковый запрос вернет только объекты, связанные с данной ролью.

Короче говоря, Hibernate Search сможет предоставить то, что вам нужно (при условии, что я правильно понимаю ваши требования). Я буду рад дать более подробную информацию о том, как, если вы хотите.

2 голосов
/ 06 июня 2010

Проверьте это:

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

Я думаю, что это правильный способ реализовать то, что вы хотите. Не знаю, как это интегрировано в hibernate-search, но, надеюсь, есть способ как-то добавить фильтр к запросу.

Позднее редактировать:

похоже, что есть:

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

0 голосов
/ 10 марта 2011

Чтобы ограничить пользователя только определенными данными, я предполагаю, что ваши данные будут сопоставлены с доступными ролями. Если это так, вам также нужно проиндексировать свой объект роли. Затем используйте аннотацию @IndexedEmbedded для связи «один ко многим» или «один к одному».

Тогда вы можете построить свой запрос как: "text: + input.getSearchText () +" + role.roleText: "+ currentUser.getRole ();

Это может работать или не работать в зависимости от сложности вашей системы управления пользователями.

0 голосов
/ 06 июня 2010

Это две отдельные проблемы:

  • ограничение, какой контент пользователь может искать в
  • фактически ищет контент

В то время как для второй проблемы вы можете легко использовать Hibernate Search (то есть просто Apache Lucene с небольшим количеством интеграции), для первой вы должны сосредоточиться на выборе правильного содержимое, которое вы хотите найти, прежде чем искать его с помощью lucene.

...