2017-03-09 12 views
0

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

答えて

1

Index Projectionsを使用すると、クエリで選択した属性のみを返すことができます。 IDはオプションです:

javax.persistence.Query persistenceQuery = fullTextEntityManager.createFullTextQuery(query, typeParameterClass); 
query.setProjection(ProjectionConstants.ID, [other fields...]) 
persistenceQuery.setMaxResults(100); 

これはクエリを返す配列を持ちます。配列の最初の要素には、各一致のIDが含まれます。

あなたがいる限り、彼らはIDが常に保存されているので、あなただけの投影したい場合は、これを追加する必要はありません

@Field(store=Store.YES) 

を使用して保存されたとしてマークされているように、同様に他のフィールドを読み込むことができますID。

このようなローディング時間がある場合は、マッピングに問題があります。私はあまりにも多くの熱心な関係が読み込まれていると思います。一般的には、それらのほとんどを怠惰にマップし、第2レベルのキャッシングを使用するのが適切です。

関連する問題