Многопользовательская фильтрация на основе дискриминатора с использованием поиска Hibernate - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь добавить полнотекстовый поиск к объекту, используя hibernate-search. В нашей схеме используется мультитенантность на основе дискриминатора, где каждый арендатор - это 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();

Или есть ли лучший способ обработки многопользовательского режима с использованием поиска в режиме гибернации со столбцами дискриминатора? Я видел пример , упомянутый в документах , но не знаю, как применить это к моему конкретному случаю использования.

1 Ответ

0 голосов
/ 27 апреля 2018

Самый простой способ - использовать Встроенную поддержку многопользовательского режима Hibernate ORM , которая в настоящее время ограничена многопользовательским режимом на основе схемы или базы данных. Если вы это сделаете, Hibernate Search будет автоматически обрабатывать мультитенантность, и вам не нужно делать что-то особенное.

Я должен признать, что документация Hibernate ORM немного озадачивает, поскольку стратегия дискриминатора упоминается, но не реализуется. Я думаю (не уверен), что вы можете установить для свойства hibernate.multiTenancy значение DISCRIMINATOR, и единственный эффект будет то, что Hibernate ORM будет требовать от вас использования идентификаторов арендаторов при каждом открытии сеанса.

Если это так (вам придется проверить), то вы можете сделать именно это: установите для свойства hibernate.multiTenancy значение DISCRIMINATOR и обязательно передайте идентификаторы арендатора при каждом создании сеанса. Тогда Hibernate Search будет обрабатывать мультитенантность из коробки, никакой дополнительной работы не требуется. Вам все равно придется реализовать мультитенантность самостоятельно на стороне базы данных, но, по крайней мере, на стороне индекса вам ничего не придется делать.

Если вы не хотите использовать встроенную функцию, тогда да, вам придется пометить parkId с помощью @Field. Я бы порекомендовал избегать ручного создания логического запроса только для этого; Вы можете просто использовать полнотекстовые фильтры .

...