hibernate search 的小小笔记

近日需要做一下搜索的功能,之前就听说过hibernate search,所以就决定采用这个。
实现了如下的功能,在多域中搜索关键字,并且在以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);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值