Hibernate SearchとLuceneを介して全文検索機能を実装しています。検索はこのように見え、かなりうまく機能します。私の問題は、エンティティクラスがほとんど非常に巨大であるため、検索されたエンティティを照会するのは非常に時間がかかるため、100件の検索結果を提供する検索には時間がかかりすぎるということです。Hibernate Search:検索時にエンティティIDのみを照会します。
フォームを開くときに、最初に長すぎたHQLクエリを使用して、最後の20個のエンティティを読み込みます。結果リストとIDに表示する必要があるフィールドのみを含むエンティティを作成しました実際のエンティティのユーザが結果を詳細に見るためにクリックした場合にのみ、実際のエンティティがロードされます。これは、照会時間を元の1/100以下に短縮しました。
同じようにHibernate Searchのクエリを高速化する方法があるので、エンティティを検索しますが、エンティティ全体ではなくオブジェクトのIDだけをクエリしますか?
EntityManager em = EntityManagerUtil.getEntityManager();
List<T> returnList=new ArrayList<>();
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
em.getTransaction().begin();
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(typeParameterClass).get();
TermMatchingContext onFields = qb.keyword().wildcard().onFields(getSearchFields());
BooleanJunction<BooleanJunction> bool = qb.bool();
org.apache.lucene.search.Query query = null;
String[] searchTerms = searchString.split("\\s+");
for (int j = 0; j < searchTerms.length; j++) {
String currentTerm = searchTerms[j];
bool.must(onFields.matching(currentTerm).createQuery());
}
query = bool.createQuery();
javax.persistence.Query persistenceQuery = fullTextEntityManager.createFullTextQuery(query, typeParameterClass);
persistenceQuery.setMaxResults(100);
returnList = persistenceQuery.getResultList();