使用hibernate search来搜索一个加入索引的信息时,可以组合多个搜索条件进行灵活搜索:
方式一:
package org.edu.scut.lab24.uam.dao.impl;
import java.util.List;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.edu.scut.lab24.uam.hibernate.Posts;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
public class searchTest {
/**
* 从多个字段里进行组合搜索
* @param objectPK
* 必段首先满足的字段(如搜索一个社区的帖子,那先得满足这个帖子为所指定的社区的ID)搜索
* @param content
* 其次满足的内容搜索
* @throws Exception
*/
//下面方法都是没有考虑自己开启事务,是建立在调用该方法会开启事务的基础上
public void mySearch1(String objectPK , String content) throws Exception{
FullTextSession fullTextSession = Search.createFullTextSession(getSession());//这个要从你的支持开启session的地方获取,如继承了HibernateDaoSupport的类里面就帮我们开启session的
String[] properties = new String[] { "title", "description", "post_user_username" };//在字段"title", "description", "post_user_username"中进行搜索
StandardAnalyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser parser = new MultiFieldQueryParser(//MultiFieldQueryParser这样使用是表示一个查询条件在多个字段里进行查询
// 这个是用户输入的的搜索串在下面的field里进行搜索
properties,
analyzer);
parser.setDefaultOperator(QueryParser.OR_OPERATOR);
BooleanQuery booleanQuery = new BooleanQuery();//用BooleanQuery来做搜索条件的组合,即多条件查询
booleanQuery.add(parser.parse(content), BooleanClause.Occur.MUST);
QueryParser parser2 = new QueryParser("post_obj_objectID", analyzer);// 从指定的ID里搜索,也就是首先在满足这个条件,再去搜索用户输入的查询串
booleanQuery.add(parser2.parse(objectPK), BooleanClause.Occur.MUST);
QueryParser parser3 = new QueryParser("isReply",analyzer);//第三个要满足的条件,还可以继续添加更多的条件
booleanQuery.add(parser3.parse("0"),BooleanClause.Occur.MUST);
FullTextQuery hibQuery = fullTextSession.createFullTextQuery(booleanQuery, Posts.class);
System.out.println("搜索的结果数:" + hibQuery.getResultSize());
List result = hibQuery.list();//用这个方法可以返回所有搜索的结果对象
}
}
方式二
public void mySearch2(String objectPK , String content){
FullTextSession fullTextSession = Search.createFullTextSession(getSession());//这个要从你的支持开启session的地方获取,如继承了HibernateDaoSupport的类里面就帮我们开启session的
String[] properties = new String[] { "post_obj_objectID", "title" , "isReply"};
Query luceneQuery = MultiFieldQueryParser.parse(new String[] { objectPK,
content , "0"}, properties,
new BooleanClause.Occur[] { Occur.MUST, Occur.MUST,Occur.MUST},
new StandardAnalyzer());//MultiFieldQueryParser这样使用是表示多个查询条件对应在多个字段里进行查询
FullTextQuery hibQuery = fullTextSession.createFullTextQuery(luceneQuery,
Posts.class);
System.out.println("搜索的结果数:" + hibQuery.getResultSize());
List result = hibQuery.list();//用这个方法可以返回所有搜索的结果对象
}
方式三