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

我将休眠查询编写为,

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

你没有添加析取。您正在添加 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 使用,顺便说一句)。

于 2013-01-20T10:57:00.067 回答