【问题标题】:Discriminator Based Multi-Tenancy Filtering Using Hibernate Search使用 Hibernate 搜索的基于鉴别器的多租户过滤
【发布时间】:2018-04-27 16:32:50
【问题描述】:

我正在尝试使用休眠搜索向实体添加全文搜索。我们的模式使用基于鉴别器的多租户,其中每个租户是一个带有 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 进行过滤。用@Field注释parkId,然后像这样将该过滤器添加到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();

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

【问题讨论】:

    标签: lucene hibernate-search


    【解决方案1】:

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

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

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

    如果您不想使用内置功能,那么可以,您必须用@Field 注释parkId。不过,我建议避免为此手动创建布尔查询;你可以简单地使用full text filters

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-07
      • 2013-05-24
      • 2018-02-06
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多