Hibernate查询在论坛中搜索内容问题

时间:2013-01-20 09:21:02

标签: java hibernate detachedcriteria

我想在论坛中搜索内容,特别是论坛问题

例如:

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%'一起

注意:如果我查询每个单词,那么数据库命中率会很高

1 个答案:

答案 0 :(得分: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)来完成这项任务。