hibernate search手动建索引和组合条件搜索(转)

本文介绍使用HibernateSearch实现的搜索功能,支持多字段关键字搜索并按ID排序。此外还提供了基于状态值的过滤器功能,允许前台进行二次筛选。文章讨论了索引创建、搜索查询及过滤等关键技术点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近日需要做一下搜索的功能,之前就听说过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);

	}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值