`
hz_chenwenbiao
  • 浏览: 995290 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

	}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics