近日需要做一下搜索的功能,之前就听说过hibernate search,所以就决定采用这个。
实现了如下的功能,在多域中搜索关键字,并且在以id排序,满足一些状态值。
而且前台可以再次通过过滤器进行二次筛选。
还需要在以后扩展的是高亮显示关键字,还有分词好像没有实现,对象时间怎么关联起来还没找到相关事例资料。服务器重启会丢失索引文件,现在必须重启服务后手动索引。
实现了如下的功能,在多域中搜索关键字,并且在以id排序,满足一些状态值。
而且前台可以再次通过过滤器进行二次筛选。
还需要在以后扩展的是高亮显示关键字,还有分词好像没有实现,对象时间怎么关联起来还没找到相关事例资料。服务器重启会丢失索引文件,现在必须重启服务后手动索引。
//手动建索引
public void createHernateIndex() {
FullTextSession s = Search.createFullTextSession(getSession());
List<Product> products = find("from Product");
long startTime = new Date().getTime();
for (Product product : products) {
System.out.println("File " + product.getProTitle() + "正在被索引....");
s.index(product);
}
long endTime = new Date().getTime();
System.out.println("一共" + products.size() + ",这花费了"
+ (endTime - startTime) + " 毫秒来把文档增加到索引里面去!");
}
//搜索
public Page proQuery(String words,String cartype,String address,int pageNo, int pageSize) throws Exception {
FullTextSession s = Search.createFullTextSession(getSession());
// MultiFieldQueryParser parser = new MultiFieldQueryParser(
// new String[] { "proName" }, new StandardAnalyzer());
// Query luceneQuery = parser.parse(words);
// Query luceneQuery = MultiFieldQueryParser.parse(new
// String[]{words},new String[]{"proName","pro_state"},new
// StandardAnalyzer());
Query luceneQuery = MultiFieldQueryParser.parse(new String[] { words,
words,words }, new String[] { "proTitle", "proDescn","car_type" },
new BooleanClause.Occur[] { Occur.SHOULD, Occur.SHOULD,Occur.SHOULD },
new StandardAnalyzer());
FullTextQuery query = s.createFullTextQuery(luceneQuery, Product.class);
// 排序
Sort sort = new Sort(new SortField[] { new SortField("id",
SortField.INT, true) });
// 过滤1
QueryParser qp1 = new QueryParser("proStatus", new StandardAnalyzer());
Query fquery = qp1.parse("2");
// 过滤2
QueryParser qp2 = new QueryParser("pro_type", new StandardAnalyzer());
Query fquery2 = qp2.parse("3");
BooleanQuery bqf = new BooleanQuery();
bqf.add(fquery, BooleanClause.Occur.MUST);
bqf.add(fquery2, BooleanClause.Occur.MUST_NOT);
// 过滤3
if (!cartype.equalsIgnoreCase("")) {
QueryParser qp3 = new QueryParser("car_type",
new StandardAnalyzer());
Query fquery3 = qp3.parse(cartype);
bqf.add(fquery3, BooleanClause.Occur.MUST);
}
// 过滤4
if (!address.equalsIgnoreCase("")) {
QueryParser qp4 = new QueryParser("proOrigin",
new StandardAnalyzer());
Query fquery4 = qp4.parse(address);
bqf.add(fquery4, BooleanClause.Occur.MUST);
}
QueryFilter qf = new QueryFilter(bqf);
query.setSort(sort);
query.setFilter(qf);
long totalCount = query.list().size();
if (totalCount < 1)
return new Page();
int startIndex = Page.getStartOfPage(pageNo, pageSize);
List<Product> list = query.setFirstResult(startIndex).setMaxResults(
pageSize).list();
return new Page(startIndex, totalCount, pageSize, list);
}