Lucene 使用Hibernate搜索的基于鉴别器的多租户过滤

Lucene 使用Hibernate搜索的基于鉴别器的多租户过滤,lucene,hibernate-search,Lucene,Hibernate Search,我正在尝试使用hibernate搜索向实体添加全文搜索。我们的模式使用基于鉴别器的多租户,其中每个租户都是一个带有id的公园 @Entity @Indexed public class ProductModel { @Field // park is the tenant private Long parkId; @Field(index = Index.YES, analyze = Analyze.YES) @Analyzer(definition = "customa

我正在尝试使用hibernate搜索向实体添加全文搜索。我们的模式使用基于鉴别器的多租户,其中每个租户都是一个带有id的
公园

@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();

或者有没有更好的方法来处理多租户使用hibernate搜索和鉴别器列?我已经看到了,但不知道如何将其应用到我的特定用例中。

最简单的方法是使用,目前仅限于基于模式或基于数据库的多租户。如果您这样做,HibernateSearch将自动处理多租户,您无需做任何特殊的事情

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

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


如果您不想使用内置功能,那么是的,您必须使用
@字段
注释
parkId
。不过,我建议不要仅仅为此手动创建布尔查询;您可以简单地使用。

最简单的方法是使用,目前仅限于基于模式或基于数据库的多租户。如果您这样做,HibernateSearch将自动处理多租户,您无需做任何特殊的事情

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

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

如果您不想使用内置功能,那么是的,您必须使用
@字段
注释
parkId
。不过,我建议不要仅仅为此手动创建布尔查询;你可以简单地使用