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

日期范围查询之hibernate search DateBridge使用

阅读更多

hibernate search 使用串和数的索引和查询都比较简单,但使用日期类型建索引和查询就稍麻烦一点:

 

1 在日期属性上加入@DateBridge注解,如:

 

/*
	 * Resolution.YEAR: yyyy Resolution.MONTH: yyyyMM Resolution.DAY: yyyyMMdd Resolution.HOUR: yyyyMMddHH Resolution.MINUTE: yyyyMMddHHmm Resolution.SECOND: yyyyMMddHHmmss Resolution.MILLISECOND: yyyyMMddHHmmssSSS
	 */
	@Field(name="beginDate" , index = Index.UN_TOKENIZED , store = Store.NO)
	@DateBridge(resolution = Resolution.MINUTE)//将日期类型转为string,直到分钟级
	private Date beginDate; //开始时间
	
	@Field(name="endDate" , index = Index.UN_TOKENIZED , store = Store.NO)
	@DateBridge(resolution = Resolution.MINUTE)
	private Date endDate; //结束时间

 使用resolution就可以将日期类型转换为string类型,再建索引,resolution可以有多种形式,见:http://docs.jboss.org/hibernate/stable/search/api/org/hibernate/search/bridge/builtin/DateBridge.html

 

2 建立索引后,进行查询,可以像上一篇《hibernate search和lucene结合使用实例》文章那样使用过滤器的方式,如直接加入检搜条件来搜索:

 

SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmm");
		String beginDateString;
		String endDateString;
		
		if( beginDate != null && endDate != null  ){//开始与结束时间都给出
//			RangeQuery rangeQuery = new RangeQuery("",beginDate	,endDate,true,true);
			
			beginDateString = df.format(beginDate);
			endDateString = df.format(endDate);
			
			RangeQuery startDateRange = new RangeQuery(new Term("beginDate", beginDateString), new Term("beginDate", endDateString), true);
			RangeQuery endDateRange = new RangeQuery(new Term("endDate", beginDateString), new Term("endDate" , endDateString), true);
			bQuery.add(startDateRange,Occur.MUST);
			bQuery.add(endDateRange,Occur.MUST);
		}
		else if(beginDate != null && endDate == null ){//只给出开始时间
			beginDateString = df.format(beginDate);
			
			RangeQuery startDateRange = new RangeQuery(new Term("beginDate", beginDateString), null , true);
			bQuery.add(startDateRange,Occur.MUST);
		}
		else if(endDate != null && beginDate == null){//只给出了结束时间
			endDateString = df.format(endDate);
			
			RangeQuery endDateRange = new RangeQuery(null, new Term("endDate" , endDateString), true);
			bQuery.add(endDateRange,Occur.MUST);
		}

对上面的代码作一下说明:RangeQuery的第一个参数设定左边范围,即指定的field的下界是多少,若没有下界,那么这个参数就是null,而第二个参数是设定右边范围,即指定的field的上界是多少,没有上界,那么这个参数为null,第三个参数为边界值是否包括在内,true表示包括,false表示不包括。

 

我使用的是lucene2.4.1包,所以这里的查询方式如上面,lucene的版本更高,范围查询具体方式有所不同。范围查询具体见下一篇《lunce3.0范围查找TermRangeQuery

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics