论坛首页 Java企业应用论坛

用lucene对时间索引后搜索的问题。

浏览 6615 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-31  
我的数据量比较大,故后台采用一个线程专用于索引的建立。目前索引库已经在700多M了,估计全部建立完成在1.5G左右。
每一个doc里包括了一个field(sendtime,时间字符串,yyyy-mm-dd hh:MM:ss格式)

在前台web进行搜索时。采用如下代码
			/**
			 * sendtime在date1与date2之间的数据
			 */
			if (startTime != null && (!"null".equalsIgnoreCase(startTime))
					&& startTime.length() > 0 && endTime != null
					&& (!"null".equalsIgnoreCase(endTime))
					&& endTime.length() > 0) {
				RangeQuery dateQuery = new RangeQuery(new Term("sendtime",
						startTime), new Term("sendtime", endTime), true);
				query.add(dateQuery, BooleanClause.Occur.MUST);
			}


此时有一个很奇怪的现象
如果从2007-01-12 23:59:59 TO 2007-01-13 23:59:59开始搜索就能查出大约4000条数据,其中包括2007-01-13 22点的数据约2000条。
如果从[2007-01-13 00:00:00 TO 2007-01-13 23:59:59]来查询13号的数据,居然没有。

有没有哪位大xia遇到过类试的问题????
   发表时间:2007-07-31  
我猜想可能是"-",":"和空格这三个字符在捣乱
0 请登录后投票
   发表时间:2007-08-01  
我只了解对于日期的搜索条件是这样的
7月: 2007-07 to 2007-08
8月1日: 2007-08-01 to 2007-08-02

都要往后推移一次,时间应该也是这样的顺序,还有就是2007-01-13 00:00:00 TO 2007-01-13 23:59:59是否搜索时仅仅是搜索了对应于日期的

2007-08-01 to 2007-08-01

这样也是搜索不到的
0 请登录后投票
   发表时间:2007-08-02  
多谢楼上的兄弟。我所描述的问题已经解决。这是RangeQuery的问题。
对时间段的分段搜索我尝试了很多种办法。只有一种办法目前看来是可行的。
把时间格式化成yyyyMMddHHmmss这种格式。
然后采用RangeFilter来做搜索。
代码如下
Filter filter = new RangeFilter("sendtime", startTime, endTime, true,true);
IndexSearcher indexSearcher = null;
if (filter != null) {
	hits = indexSearcher.search(query,filter, new Sort(new SortField(
							"id", SortField.STRING, true)));
} else {
	hits = indexSearcher.search(query, new Sort(new SortField(
							"id", SortField.STRING, true)));
				}
其它方式都不行。都会出来这样哪样的问题。


0 请登录后投票
   发表时间:2007-08-09  
yinhj 写道
多谢楼上的兄弟。我所描述的问题已经解决。这是RangeQuery的问题。
对时间段的分段搜索我尝试了很多种办法。只有一种办法目前看来是可行的。
把时间格式化成yyyyMMddHHmmss这种格式。
然后采用RangeFilter来做搜索。
代码如下
Filter filter = new RangeFilter("sendtime", startTime, endTime, true,true);
IndexSearcher indexSearcher = null;
if (filter != null) {
	hits = indexSearcher.search(query,filter, new Sort(new SortField(
							"id", SortField.STRING, true)));
} else {
	hits = indexSearcher.search(query, new Sort(new SortField(
							"id", SortField.STRING, true)));
				}
其它方式都不行。都会出来这样哪样的问题。


噢,我上次只是对时间范围进行搜索,还没遇到过具体精确到秒的问题,哈哈
0 请登录后投票
   发表时间:2007-08-09  
那是因为RangeQuery内部被rewrite成许多TermQuery,时间精度越高、范围越大,TermQuery就越多,超过1024个,就爆掉了。
一般这种精确到天即可,限制365天,然后就没问题了。
1 请登录后投票
   发表时间:2007-11-22  
caocao 写道
那是因为RangeQuery内部被rewrite成许多TermQuery,时间精度越高、范围越大,TermQuery就越多,超过1024个,就爆掉了。
一般这种精确到天即可,限制365天,然后就没问题了。
那楼主的时间已经精确到秒了,2007-01-12 23:59:59 TO 2007-01-13 23:59:59如果按秒被rewrite的话早就超过1024了呀?可还是搜出来了,是否rewrite也不是按查询时的最小进度进行分割的?
小弟对此不解,愿闻其详?
0 请登录后投票
   发表时间:2008-05-15  
unique5945 写道
caocao 写道
那是因为RangeQuery内部被rewrite成许多TermQuery,时间精度越高、范围越大,TermQuery就越多,超过1024个,就爆掉了。
一般这种精确到天即可,限制365天,然后就没问题了。
那楼主的时间已经精确到秒了,2007-01-12 23:59:59 TO 2007-01-13 23:59:59如果按秒被rewrite的话早就超过1024了呀?可还是搜出来了,是否rewrite也不是按查询时的最小进度进行分割的?
小弟对此不解,愿闻其详?


rewrite的时候是根据索引文件里Term来搞的,如果那个时间段里只有500个Term,rewrite出来就是500个TermQuery
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics