@azerphoenix

Как корректно настроить Hibernate Search?

Доброго времени суток!
Как корректно настроить hibernate search, чтобы ограничить поиск по определенным сущностям текущего пользователя?
Например, есть 2 сущности User & Website. Нужно, чтобы в искомых результатах отображался не весь результат сайтов, а только сайты добавленные текущем пользователем.

Текущая реализация:

WebsiteSearch
@Repository
@Transactional
public class WebsiteSearch {

  @PersistenceContext
  private EntityManager entityManager;

  public List<Website> websiteSearch(String text) {

    // get the full text entity manager
    FullTextEntityManager fullTextEntityManager =
            org.hibernate.search.jpa.Search.
                    getFullTextEntityManager(entityManager);

    // create the query using Hibernate Search query DSL
    QueryBuilder queryBuilder =
            fullTextEntityManager.getSearchFactory()
                    .buildQueryBuilder().forEntity(Website.class).get();

    // a very basic query by keywords
    org.apache.lucene.search.Query query =
            queryBuilder
                    .keyword()
                    .onFields("websiteUrl")
                    .matching(text)
                    .createQuery();

    // wrap Lucene query in an Hibernate Query object
    org.hibernate.search.jpa.FullTextQuery jpaQuery =
            fullTextEntityManager.createFullTextQuery(query, Website.class);

    // execute search and return results (sorted by relevance as default)
    @SuppressWarnings("unchecked")
    List<Website> results = jpaQuery.getResultList();
    return results;
  }
  
}



Метод в контроллере:
@GetMapping("/search")
public @ResponseBody List<Website> searchWebsite(
  @RequestParam(value = "q", required = false) String searchQuery
) {
List<Website> searchResults = null;
try {
  searchResults = websiteSearch.websiteSearch(searchQuery);
}
catch (Exception ex) {
  // here you should handle unexpected errors
  // ...
  // throw ex;
}
	return searchResults;
}


P.S. Тут еще один нюанс - в результатах поиска отображается JSON, а так как сущности связаны с другими сущностями через OneToMany и т.д., то в ответе возвращается все отношения из-за чего возникает ошибка. Правильно ли я понимаю, что нужно возвращать DTO вместо Entity?
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы