`
yinhj
  • 浏览: 74168 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

阅读更多
我的数据量比较大,故后台采用一个线程专用于索引的建立。目前索引库已经在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遇到过类试的问题????
分享到:
评论
7 楼 caocao 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
6 楼 unique5945 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也不是按查询时的最小进度进行分割的?
小弟对此不解,愿闻其详?
5 楼 caocao 2007-08-09  
那是因为RangeQuery内部被rewrite成许多TermQuery,时间精度越高、范围越大,TermQuery就越多,超过1024个,就爆掉了。
一般这种精确到天即可,限制365天,然后就没问题了。
4 楼 cavenaghi 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)));
				}
其它方式都不行。都会出来这样哪样的问题。


噢,我上次只是对时间范围进行搜索,还没遇到过具体精确到秒的问题,哈哈
3 楼 yinhj 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)));
				}
其它方式都不行。都会出来这样哪样的问题。


2 楼 cavenaghi 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

这样也是搜索不到的
1 楼 yinhj 2007-07-31  
我猜想可能是"-",":"和空格这三个字符在捣乱

相关推荐

    Lucene之删除索引

    首先,删除索引是Lucene中一个关键的操作,因为随着时间的推移,数据可能会更新或过时,此时就需要删除旧的索引信息。Lucene的索引删除过程并不像传统的文件系统删除那么简单,它涉及到对倒排索引结构的修改。 1. *...

    Lucene时间区间搜索

    总之,Lucene在C#中的时间区间搜索是通过构建和执行RangeQuery来实现的,这涉及到索引构建、查询解析、时间值的转换和比较等多个环节。合理地利用这些技术,可以有效地提升数据检索的效率和准确性。在实际应用中,还...

    基于lucene的索引与搜索

    本文档主要探讨了基于Apache Lucene的索引与搜索技术,这是构建高效全文搜索引擎的关键组成部分。Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言...

    lucene5+zoie实现近实时索引

    Zoie(Zero-Offset Indexing Engine)是一个基于Lucene的实时索引框架,它通过将索引分片并行处理,实现了在不影响搜索性能的同时,对新数据进行即时索引。Zoie的核心理念是将索引分为多个版本,每个版本对应一个...

    lucene 4.7.2 Demo

    本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...

    lucene索引结构原理.docx

    【Lucene 索引结构原理】 Lucene 是一个高性能、全文检索的开源...在Lucene中,这个过程包括分析文本、创建倒排索引等步骤,使得搜索操作从线性时间复杂度转变为对数时间复杂度,显著提高了大规模文本数据的检索速度。

    lucene并行索引

    假设有一家互联网公司正在开发一个新的搜索引擎产品,他们选择使用Lucene作为核心的索引构建技术。为了应对每天新增的大量网页数据,该公司决定采用基于Lucene的分布式并行索引技术。具体步骤如下: 1. **需求分析*...

    Lucene5写的全文搜索的demo,包括创建索引和搜索

    从索引的构建到查询的执行,每个步骤都涉及到对 Lucene API 的深入理解。通过学习这个示例,开发者可以进一步了解 Lucene 的工作原理,并将其应用到自己的项目中,提升搜索功能的效率和用户体验。

    Lucene.net建立索引,检索分页Demo

    - 倒排索引:Lucene 使用倒排索引来加速搜索,每个词项对应一组包含它的文档编号。 - 索引压缩:通过设置不同的编码策略和压缩级别,可以减小索引占用的空间,提高检索速度。 - 多线程:在多核处理器上,可以使用...

    深入了解Lucene之二 索引结构.ppt

    Lucene是一个强大的全文搜索引擎库,它的核心功能之一就是构建高效的索引结构,使得数据的检索过程快速而精准。本篇内容将详细解析Lucene的索引结构,帮助你更好地理解和运用这个强大的工具。 首先,我们要明白索引...

    基于Lucene索引的分析与实现

    Lucene,作为一个强大的Java全文检索库,提供了便捷的索引和搜索功能,为解决海量数据的检索难题提供了有效的解决方案。 全文检索是指从大量非结构化数据中提取关键信息,构建索引,然后通过索引快速定位所需信息的...

    lucene分词搜索,增量索引及全量索引

    《Lucene分词搜索、增量索引与全量索引详解》 在现代信息检索系统中,搜索引擎扮演着至关重要的角色。Apache Lucene是一个高性能、全文本搜索库,被广泛应用于构建复杂的数据检索应用。本文将深入探讨Lucene的分词...

    一个非常好的检测lucene索引库的工具

    2. 性能评估:通过模拟不同类型的搜索请求,评估索引的响应时间和性能,为优化提供依据。 3. 索引一致性检查:确认索引的各个部分是否完整,没有损坏或丢失的数据。 4. 日常维护:在定期维护中,使用此工具可以确保...

    经典的lucene实例代码及详细解析以及lucene结构流程介绍

    Lucene优化是指对Lucene索引和搜索进行优化的过程。Lucene提供了多种优化方式,包括索引优化、搜索优化和缓存优化等。 在上面的代码中,我们使用了`optimize()`方法对索引进行优化。该方法将合并磁盘上的索引文件,...

    基于Lucene的分布式并行索引.pdf

    然而,尽管Lucene提供了强大的索引能力,但在实际应用中,随着索引的文档数量日益增多,索引处理的时间成线性增长,这就导致了搜索引擎在建立索引的过程中会显著影响搜索体验。尤其是当索引文件量达到一定规模时,...

    Lucene.net高速创建索引

    描述中提到的“对SQL Server数据库表,用多线程,高速创建索引”,是指在构建Lucene.NET索引时,采用了多线程技术来提升性能。这种做法可以充分利用多核处理器的计算能力,将数据处理任务分散到多个线程中,从而加快...

    Lucene3总体图_建索引_查询_数据库索引

    ### Lucene3总体架构与操作流程 ...通过对各个模块的深入理解,开发者可以更好地利用Lucene来构建高效、灵活的搜索应用。随着版本的演进,Lucene不断增强了对国际化支持等功能,使其在更广泛的场景下发挥重要作用。

    lucene3.6 搜索例子

    3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新修改。 五、总结 Lucene 3.6作为一款强大的全文搜索库,提供了完整的搜索解决方案,包括高效的索引构建、灵活的查询语法和...

    lucene索引简单介绍

    倒排索引允许Lucene在O(log n)的时间复杂度内完成搜索,极大地提高了效率。 3. **字段(Field)**:在Lucene中,文档由多个字段组成,每个字段都有特定的含义,如标题、内容等。字段可以设置不同的分析器,以适应...

Global site tag (gtag.js) - Google Analytics