注意使用lucene的版本,调试本例的时候,作者使用的是lucene 2.4.1
package com.zhx.test;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.LockObtainFailedException;
public class IndexDate {
/**
* @param args
*/
public static void main(String[] args) {
//索引所在的文件夹
String IDNEX_PATH = "Z:/data/paoding/test_index";
//索引字段名
String FILED_NAME = "fieldDate";
//索引字段名
String FILED_CONTENT = "field_content";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//获取Paoding中文分词器
Analyzer analyzer = new SimpleAnalyzer();
//建立索引
IndexWriter writer;
try {
//IndexWriter.MaxFieldLength(1)表示只索引到第几个项
writer = new IndexWriter(IDNEX_PATH, analyzer, true,new IndexWriter.MaxFieldLength(1));
//索引日期字段的值
Date fieldDate = sdf.parse("2009-08-22");
Document doc1 = new Document();
//用DateTools工具转换成String类型
String fieldDateStr = DateTools.dateToString(fieldDate,
DateTools.Resolution.MINUTE);
//创建field,不存储,不分词但索引
Field field = new Field(FILED_NAME, fieldDateStr, Field.Store.NO,
Field.Index.NOT_ANALYZED, Field.TermVector.NO);
//创建field,存储,分词并索引
Field fieldContent = new Field(FILED_CONTENT, "记录1", Field.Store.YES,
Field.Index.ANALYZED, Field.TermVector.YES);
//添加进doc
doc1.add(field);
doc1.add(fieldContent);
writer.addDocument(doc1);
Document doc2 = new Document();
fieldDate = sdf.parse("2009-08-20");
fieldDateStr = DateTools.dateToString(fieldDate,
DateTools.Resolution.MINUTE);
field = new Field(FILED_NAME, fieldDateStr, Field.Store.NO,
Field.Index.NOT_ANALYZED, Field.TermVector.NO);
fieldContent = new Field(FILED_CONTENT, "记录2", Field.Store.YES,
Field.Index.ANALYZED, Field.TermVector.YES);
doc2.add(field);
doc2.add(fieldContent);
writer.addDocument(doc2);
writer.close();
System.out.println("Indexed success!");
//检索
IndexReader reader = IndexReader.open(IDNEX_PATH);
Date startDate = sdf.parse("2009-07-21");
Date endDate = sdf.parse("2009-09-21");
String startDateStr = DateTools.dateToString(startDate,
DateTools.Resolution.MINUTE);
String endDateStr = DateTools.dateToString(endDate,
DateTools.Resolution.MINUTE);
Term start = new Term(FILED_NAME,startDateStr);
Term end = new Term(FILED_NAME,endDateStr);
RangeQuery rangeQuery = new RangeQuery(start,end,true);
Searcher searcher = new IndexSearcher(reader);
//列表大小
int count = 10;
TopDocs topDocs = searcher.search(rangeQuery,count);
if (topDocs.totalHits == 0) {
System.out.println("hits.length=0");
}else{
//获取记录数组
ScoreDoc[] hits = topDocs.scoreDocs;
for(int i=0;i<hits.length;i++){
//获取某条记录的Id
int docId = hits[i].doc;
Document doc = searcher.doc(docId);
System.out.println("第"+i+"结果:"+doc.get(FILED_CONTENT));
}
}
reader.close();
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (LockObtainFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (java.text.ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分享到:
相关推荐
### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...
- **索引(Index)**:索引是Lucene处理数据的核心,它将文本数据转换为可供快速搜索的结构。 - **分词器(Tokenizer)**:分词器将输入的文本分解为一系列的词语,这是建立索引的第一步。 - **分析器(Analyzer)...
【Lucene 索引结构原理】 Lucene 是一个高性能、全文检索的开源...在Lucene中,这个过程包括分析文本、创建倒排索引等步骤,使得搜索操作从线性时间复杂度转变为对数时间复杂度,显著提高了大规模文本数据的检索速度。
Lucene 是一个流行的开源全文搜索引擎库,其核心功能之一就是构建高效的索引。索引文件格式是Lucene实现快速搜索的关键。以下是对Lucene索引文件格式的详细说明。 首先,我们要理解Lucene索引的基本结构。一个...
范围搜索是Lucene的另一个亮点,允许用户按数值或日期范围进行过滤。例如,你可以搜索价格在特定区间内的商品,或者查找某个时间段内的新闻。这需要利用RangeQuery或NumericRangeQuery类来构建相应的查询条件。 ...
2. **字段浏览**:LukeAll可以展示索引中的所有字段,包括字段名、字段类型(如文本、数值或日期)、是否可搜索、是否存储等属性。这对于理解和调整索引策略至关重要,因为它揭示了文档数据如何被组织和处理。 3. *...
总之,Lucene在C#中的时间区间搜索是通过构建和执行RangeQuery来实现的,这涉及到索引构建、查询解析、时间值的转换和比较等多个环节。合理地利用这些技术,可以有效地提升数据检索的效率和准确性。在实际应用中,还...
对于大型数据集,Lucene可以通过Solr或Elasticsearch等工具实现分布式搜索,将索引分散在多台机器上,提高检索效率和容错能力。 了解并掌握Lucene的这些原理,有助于开发者构建高效、灵活的全文搜索应用,满足各种...
5. **过滤与排序**:除了返回最相关的搜索结果,我们还需要对结果进行过滤(例如,按日期或评分排序),这可以通过Filter和Sort类来实现。 6. ** faceted search(面式搜索)**:在大型信息集合中,提供分类浏览和...
Lucene提供了完整的文本索引及搜索能力,无需任何第三方程序支持。它是一个用Java编写的全文检索引擎,具有强大的文本分析能力,可以实现快速的全文搜索。 #### 桌面搜索软件背景 随着个人电脑上数据量的不断增长...
**Lucene 搜索引擎实现详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一套强大的数据结构和算法,用于高效地存储和检索大量文本数据。通过 Lucene,开发者可以轻松地在自己的应用...
索引是Lucene的核心,它将文档的内容转换为可快速搜索的数据结构。索引过程包括分析、倒排和存储等步骤,使得搜索操作能够高效地进行。 ### 2. 构建搜索引擎步骤 **2.1 初始化** 首先,我们需要导入Lucene的相关库...
本文将深入探讨Lucene的核心概念、索引过程以及如何利用其进行高效的全文搜索。 1. Lucene的基本概念 - **倒排索引**:Lucene的核心是倒排索引,这是一种数据结构,可以快速定位到文档中包含特定词的位置。在倒排...
接着,它将详细讲解Lucene的安装和配置,以及如何创建、索引和搜索文档,让读者快速上手Lucene的基本操作。 在索引构建部分,书中的内容可能涵盖如何处理各种数据类型(如文本、数字、日期)的索引,以及如何利用...
Lucene 实现了索引和搜索的核心算法,包括倒排索引、TF-IDF(词频-逆文档频率)等,使得开发者能够快速构建自己的全文检索系统。 **一、Lucene 的核心概念** 1. **倒排索引(Inverted Index)**:这是 Lucene 最...
7. **过滤器和高亮显示**:Lucene支持在搜索结果中应用过滤条件,如日期范围或文档类型。同时,高亮显示功能可以突出显示匹配的查询词,提高用户体验。 8. **分布式搜索**:通过Solr或Elasticsearch等基于Lucene的...
1. 索引模块(Index): Lucene 的索引模块是整个搜索引擎的核心,负责将数据源转换为可搜索的索引结构。索引模块的主要功能是将数据源解析成 Document 对象,然后将其写入索引中。 2. 检索模块(Search): Lucene...
在本项目中,Lucene被用来构建和管理索引,包括初始化索引、实时索引、关键字索引、数字及日期索引等。Lucene支持高效的全文检索,具备分词、模糊匹配、高亮显示等功能,极大地提高了搜索引擎的性能。 **项目结构与...
此外,为了提供更丰富的搜索体验,还可以为每个文件添加额外的元数据,如作者、创建日期和文件类型,这些信息也可以被索引。 搜索功能的实现涉及构建Query对象,这可以是简单的关键词查询,也可以是复杂的布尔...
从"lucene3.0.3搜索的使用示例"中,你将学习如何编写代码来完成这些任务,包括索引创建、查询构造、搜索执行以及结果处理等。 在压缩包中的示例代码通常会涵盖这些概念,通过实际运行和调试这些代码,你可以深入...