1

我正在使用休眠。我正在寻找一个免费的文本引擎。

在我调查之前,我需要你的经验。

我的应用程序中有用户、角色和对象表。用户与一个或多个角色相关联,而一个角色与一个或多个对象相关联。

在我的自由文本搜索中,用户只能访问对象表允许他观看的数据。

Hibernate 搜索可以帮助我吗?

4

4 回答 4

5

根据您对模型的描述,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")要获取角色并将它们嵌入为为 Object 创建的索引的一部分,您只需将@ManyToMany.

然后,您可以定义一个过滤器,使用@FullTextFilterDef该过滤器查看此嵌入索引并按给定角色(可能是运行搜索的用户的角色)进行过滤。这将确保搜索查询仅返回与给定角色相关的对象。

简而言之,Hibernate Search 将能够提供您所需要的(假设我正确理解了您的要求)。如果您愿意,我很乐意提供更多详细信息。

于 2011-02-10T02:55:00.623 回答
2

看一下这个:

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

我认为这是实现您想要的正确方法。真的不知道这如何集成到休眠搜索中,但希望有一种方法可以以某种方式将过滤器添加到查询中。

后期编辑:

看起来有:

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

于 2010-06-06T14:19:23.230 回答
0

为了限制用户只能访问某些数据,我假设您的数据将被映射到可访问的角色。如果是这种情况,您还需要索引您的角色对象。然后使用 @IndexedEmbedded 注释来进行一对多或一对一的关联。

然后你可以像这样构造你的查询: "text:+ input.getSearchText() + "+role.roleText:" + currentUser.getRole();

这可能会或可能不会起作用,具体取决于您的用户管理系统的复杂程度。

于 2011-03-10T02:22:20.883 回答
0

这是两个不同的问题:

  • 限制用户可以搜索的内容
  • 实际搜索内容

对于第二个问题,您可以轻松地使用Hibernate Search(即集成了一些Apache Lucene),而对于第一个问题,您应该在使用 lucene 搜索之前专注于选择要搜索的正确内容。

于 2010-06-06T13:32:17.660 回答