基于判别器的Hibernate搜索多租户过滤

时间:2018-04-27 16:32:51

标签: lucene hibernate-search

我正在尝试使用hibernate-search向实体添加全文搜索。我们的架构使用基于鉴别器的多租户,其中每个租户都是带有id的park。该模型如下所示:

@Entity
@Indexed
public class ProductModel {
  @Field
  // park is the tenant 
  private Long parkId;

  @Field(index = Index.YES, analyze = Analyze.YES)
  @Analyzer(definition = "customanalyzer")
  private String name;

  @Field(index = Index.YES, analyze = Analyze.YES)
  @Analyzer(definition = "customanalyzer")
  private String description;
}

执行全文搜索时,我将始终根据parkId进行过滤。使用parkId注释@Field是否有意义,然后将该过滤器添加到lucene查询中,如下所示:

org.apache.lucene.search.Query luceneQuery = qb
  .bool()
    .must(qb.keyword().onFields("parkId").matching(parkIdFilter)) 

    // any aditional queries, like on name, description
   .must(qb.keyword().onFields(fields).matching(textQuery).createQuery())
  .createQuery();

或者使用具有鉴别器列的hibernate搜索是否有更好的方法来处理多租户?我见过example mentioned in the docs,但不知道如何将其应用到我的特定用例中。

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用Hibernate ORM's built-in multi-tenancy support,目前仅限于基于架构或基于数据库的多租户。如果你这样做,Hibernate Search会自动处理多租户,你不需要做任何特别的事情。

我必须承认Hibernate ORM的文档有点令人费解,因为提到了鉴别器策略,但没有实现。 我认为(不确定)您可以将hibernate.multiTenancy属性设置为DISCRIMINATOR,唯一的影响是Hibernate ORM会要求您每次使用租户ID开会。

如果是这种情况(您必须检查),那么您可以这样做:将hibernate.multiTenancy属性设置为DISCRIMINATOR,并确保每次创建时都传递租户ID一个会议。然后,Hibernate Search将立即处理多租户,无需额外的工作。您仍然需要自己在数据库端实现多租户,但至少在索引端您不必执行任何操作。

如果您不想使用内置功能,那么是的,您必须使用parkId注释@Field。我建议尽量避免手动创建一个布尔查询。您只需使用full text filters