我正在使用休眠。我正在寻找一个免费的文本引擎。
在我调查之前,我需要你的经验。
我的应用程序中有用户、角色和对象表。用户与一个或多个角色相关联,而一个角色与一个或多个对象相关联。
在我的自由文本搜索中,用户只能访问对象表允许他观看的数据。
Hibernate 搜索可以帮助我吗?
我正在使用休眠。我正在寻找一个免费的文本引擎。
在我调查之前,我需要你的经验。
我的应用程序中有用户、角色和对象表。用户与一个或多个角色相关联,而一个角色与一个或多个对象相关联。
在我的自由文本搜索中,用户只能访问对象表允许他观看的数据。
Hibernate 搜索可以帮助我吗?
根据您对模型的描述,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 将能够提供您所需要的(假设我正确理解了您的要求)。如果您愿意,我很乐意提供更多详细信息。
看一下这个:
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
为了限制用户只能访问某些数据,我假设您的数据将被映射到可访问的角色。如果是这种情况,您还需要索引您的角色对象。然后使用 @IndexedEmbedded 注释来进行一对多或一对一的关联。
然后你可以像这样构造你的查询: "text:+ input.getSearchText() + "+role.roleText:" + currentUser.getRole();
这可能会或可能不会起作用,具体取决于您的用户管理系统的复杂程度。
这是两个不同的问题:
对于第二个问题,您可以轻松地使用Hibernate Search(即集成了一些Apache Lucene),而对于第一个问题,您应该在使用 lucene 搜索之前专注于选择要搜索的正确内容。