0

フォーラムの内容、特にフォーラムの質問を検索したい

例えば:

searchString = "Hibernate Session Configuration"; 

フォーラムの質問で対応する詳細を提供します

ただし、フォーラムのコンテンツではすべての単語が連続している必要はないため、java.util.Set各単語を含む検索文字列を格納しています。

String[] searchArray= searchString.toLowerCase().split(" ");
Set<String> searchSet = new HashSet<String>();

// searchSet contains words of searchString
for(String string : searchArray){
searchSet.add(string);
}

Hibernateクエリを次のように記述しました。

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(ForumQuestion.class);

for(String searchUnitString : searchSet)
{
detachedCriteria= detachedCriteria.add(Restrictions.disjunction().add(Restrictions.ilike("forumQuestion", "%"+searchUnitString+"%")));
}
return template.findByCriteria(detachedCriteria);

しかし、このクエリは正しく機能していません。Restrictions前のクエリを無視して最後のクエリを実行するだけRestrictionsです。

この例では、「%Configuration%」のみが考慮されますが、必要なのは「%Hibernate%」または「%Session%」または「%Configuratoin%」です。

注:各単語をクエリすると、データベースのヒット数が高くなります

4

1 に答える 1

1

論理和を追加していません。それぞれ 1 つの制限のみを含む N 個の選言を追加しています。コードは次のようになります。

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(ForumQuestion.class);
Disjunction disjunction = Restrictions.disjunction();
for (String searchUnitString : searchSet) {
     disjunction.add(Restrictions.ilike("forumQuestion", "%"+searchUnitString+"%"));
}
detachedCriteria.add(disjunction);
return template.findByCriteria(detachedCriteria);

フォーラムにほとんど質問がない場合を除き、これらの検索は遅くなることに注意してください。SQL クエリは、全文検索を処理する最良の方法ではありません。そのようなタスクについては、Lucene (Hibernate Search が使用する、BTW) を検討します。

于 2013-01-20T10:57:00.067 に答える