刚开始接触Lucene,看到好多推荐Lucene in action
虽然代码用的是lucene 1,但原理讲的很清楚,稍作修改即可。
下面给出lucene最简单的一个应用实例,从书上修改而来
Lucene in action 中用的为Lucene 1,我用lucene 2来实现了Lucene in action 第一章 初始Lucene
索引过程:
核心类:
IndexWriter, Directory, Analyzer, Document, Field
Indexer如下
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
/**
* @author xusulong
*
*/
public class Indexer {
public static void main(String[] args) throws Exception {
File indexDir = new File("D:\\index");
File dataDir = new File("D:\\lucene-2.4.1");
long start = new Date().getTime();
int numIndexed = index(indexDir, dataDir);
long end = new Date().getTime();
System.out.println("Indexing " + numIndexed + " files took "
+ (end - start) + " milliseconds");
}
public static int index(File indexDir, File dataDir) throws IOException{
if(!dataDir.exists() || !dataDir.isDirectory()) {
throw new IOException(dataDir + " does not exixt or is not a diretory");
}
//创建lucene索引
IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
writer.setUseCompoundFile(false);
indexDirectory(writer, dataDir);
int numIndexed = writer.maxDoc();
writer.optimize();
writer.close(); //关闭索引
return numIndexed;
}
private static void indexDirectory(IndexWriter writer, File dir) throws IOException{
File[] files = dir.listFiles();
for( int i = 0; i < files.length; i ++) {
File f = files[i];
if(f.isDirectory()) {
indexDirectory(writer, f);//遍历
} else if(f.getName().toLowerCase().endsWith(".txt")) {
indexFile(writer, f);
}
}
}
private static void indexFile(IndexWriter writer, File f) throws IOException{
if(f.isHidden() || !f.exists() || !f.canRead()) {
return;
}
System.out.println("Indexing " + f.getCanonicalPath());
Document doc = new Document();
//索引文件中的内容
doc.add(new Field("contents", new FileReader(f)));
//索引文件名
doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));
//将Document对象添加到lucene的索引中去
writer.addDocument(doc);
}
}
搜索过程:
核心类:
IndexSearcher, Term, Query, QueryParser, TopDocs, ScoreDoc
Searcher如下
import java.io.File;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
/**
* @author xusulong
*
*/
public class Searcher {
public static void main(String[] args) throws Exception {
File indexDir = new File("D:\\index");
String q = "lucene";
if (!indexDir.exists() || !indexDir.isDirectory()) {
throw new Exception(indexDir
+ " does not exixt or is not a diretory");
}
search(indexDir, q);
}
public static void search(File indexDir, String q) throws Exception {
// 打开索引
Directory fsDir = FSDirectory.getDirectory(indexDir);
// 对查询的字符串进行解析
IndexSearcher is = new IndexSearcher(fsDir);
QueryParser parser = new QueryParser("contents", new StandardAnalyzer());
Query query = parser.parse(q);
long start = new Date().getTime();
// 搜索索引
TopDocs topDocs = is.search(query, 100);
ScoreDoc[] hits = topDocs.scoreDocs;
long end = new Date().getTime();
System.out.println("Found " + hits.length + " document(s) (in "
+ (end - start) + " milliseconds) that mactched query '" + q
+ "':");
for (int i = 0; i < hits.length; i++) {
int docId = hits[i].doc;
// 检索匹配到的文件,显示文件名
Document doc = is.doc(docId);
System.out.println(docId + ": " + doc.get("filename"));
}
}
}
结果
两个程序都在我的机器上运行成功(windows xp),结果如下:
Indexer:
Indexing D:\lucene-2.4.1\BUILD.txt
Indexing D:\lucene-2.4.1\CHANGES.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\java\org\apache\lucene\analysis\nl\stems.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\java\org\apache\lucene\analysis\nl\words.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\de\data.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\stemsUnicode.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\test1251.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\testKOI8.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\testUnicode.txt
Indexing D:\lucene-2.4.1\contrib\analyzers\src\test\org\apache\lucene\analysis\ru\wordsUnicode.txt
Indexing D:\lucene-2.4.1\contrib\ant\src\test\org\apache\lucene\ant\test.txt
Indexing D:\lucene-2.4.1\contrib\benchmark\CHANGES.txt
Indexing D:\lucene-2.4.1\contrib\benchmark\src\test\org\apache\lucene\benchmark\quality\trecQRels.txt
Indexing D:\lucene-2.4.1\contrib\benchmark\src\test\org\apache\lucene\benchmark\quality\trecTopics.txt
Indexing D:\lucene-2.4.1\contrib\CHANGES.txt
Indexing D:\lucene-2.4.1\contrib\memory\src\test\org\apache\lucene\index\memory\testqueries.txt
Indexing D:\lucene-2.4.1\contrib\memory\src\test\org\apache\lucene\index\memory\testqueries2.txt
Indexing D:\lucene-2.4.1\contrib\miscellaneous\README.txt
Indexing D:\lucene-2.4.1\contrib\queries\README.txt
Indexing D:\lucene-2.4.1\contrib\similarity\README.txt
Indexing D:\lucene-2.4.1\contrib\snowball\LICENSE.txt
Indexing D:\lucene-2.4.1\contrib\snowball\README.txt
Indexing D:\lucene-2.4.1\contrib\snowball\SNOWBALL-LICENSE.txt
Indexing D:\lucene-2.4.1\contrib\surround\README.txt
Indexing D:\lucene-2.4.1\contrib\wordnet\README.txt
Indexing D:\lucene-2.4.1\contrib\xml-query-parser\src\test\org\apache\lucene\xmlparser\reuters21578.txt
Indexing D:\lucene-2.4.1\docs\skin\images\README.txt
Indexing D:\lucene-2.4.1\docs\skin\note.txt
Indexing D:\lucene-2.4.1\LICENSE.txt
Indexing D:\lucene-2.4.1\NOTICE.txt
Indexing D:\lucene-2.4.1\README.txt
Indexing D:\lucene-2.4.1\src\jsp\README.txt
Indexing 32 files took 657 milliseconds
Searcher:
Found 14 document(s) (in 15 milliseconds) that mactched query 'lucene':
30: D:\lucene-2.4.1\README.txt
24: D:\lucene-2.4.1\contrib\wordnet\README.txt
17: D:\lucene-2.4.1\contrib\miscellaneous\README.txt
19: D:\lucene-2.4.1\contrib\similarity\README.txt
21: D:\lucene-2.4.1\contrib\snowball\README.txt
31: D:\lucene-2.4.1\src\jsp\README.txt
0: D:\lucene-2.4.1\BUILD.txt
29: D:\lucene-2.4.1\NOTICE.txt
23: D:\lucene-2.4.1\contrib\surround\README.txt
11: D:\lucene-2.4.1\contrib\benchmark\CHANGES.txt
14: D:\lucene-2.4.1\contrib\CHANGES.txt
18: D:\lucene-2.4.1\contrib\queries\README.txt
1: D:\lucene-2.4.1\CHANGES.txt
28: D:\lucene-2.4.1\LICENSE.txt
分享到:
相关推荐
在SpringBoot中,我们需要配置Lucene的初始化。我们将创建一个Bean类,用于实例化IndexWriter和IndexSearcher。 IndexWriter用于创建索引,而IndexSearcher用于搜索索引。 在配置中,我们需要注意以下几点: * ...
创建IndexWriter对象**:初始化索引写入器。 - **2. 创建文档Document对象,并加入域(Field)**:定义文档结构和内容。 - **3. 将文档加入IndexWriter**:执行文档的索引化操作。 - **4. 将文档加入DocumentsWriter*...
1. **初始化索引**: 创建一个Directory对象(如FSDirectory),表示存储索引的物理位置。然后使用IndexWriter实例化,配置Analyzer,开始创建或更新索引。 2. **读取文件**: 逐个读取Word、txt、Html等文件,将每个...
1. **初始化索引目录**:首先,我们需要创建一个目录来存储索引。这通常通过 `FSDirectory.open()` 方法完成。 2. **创建索引**: - 创建 `IndexWriter` 对象,配置分析器和其他参数。 - 使用 `Document` 对象...
WebLucene是一款开源的、基于Java开发的全文搜索引擎,它为Web应用提供了强大的搜索功能。在本安装文档中,我们将详细介绍如何一步步地安装并配置WebLucene,以便于你能够快速地将它集成到你的项目中。 首先,我们...
**Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...
这段代码初始化了一个`IndexWriter`,用于创建新的索引。`new StandardAnalyzer()`表示使用标准分析器对文本进行分词处理。 2. **文档添加**: ```java Document doc1 = new Document(); Document doc2 = new ...
完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们需要监听数据源的变化。这可以通过数据库触发器、文件系统监控或者消息队列来实现。一旦检测到变化,就需要获取更改的具体...
- 初始化SAX处理器实例,并解析XML文档。 - 处理过程中,通过SAX处理器类的方法来捕获文档结构信息。 3. **创建索引** - 基于解析出的信息,使用Lucene的API创建索引。 - 对于每个文档元素,创建对应的`Field`...
这个类可能会有一个构造函数来初始化分组字段值,以及增加和获取文档计数的方法。 为了动态地处理不同数量的分组字段,可以在 `MultiFieldGroupCollector` 中使用一个映射数据结构(如 `HashMap`),键为分组字段的...
- 示例代码展示如何初始化索引目录,创建`IndexWriter`实例,并使用`Document`对象添加字段来构建索引。 - 如何使用`Analyzer`处理文本,例如自定义分词规则。 - `QueryParser`的用法,演示如何从用户输入构建`Query...
Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的全文检索库,它提供了文本检索的核心工具,使得开发者能够快速地在应用程序中实现高级的搜索功能。本篇文章将详细阐述如何使用Lucene来创建和查询索引,...
通过这两个文件,我们可以了解如何初始化索引器、添加文档到索引、以及如何执行查询来获取匹配的文档。 **详细知识点:** 1. **索引过程**:在`TestLuceneIndex.java`中,首先会创建一个`Directory`对象,如`...
2. **初始化环境**: - 设置索引目录`indexDir`和数据文件目录`dataDir`。 - 创建一个`Analyzer`对象,用于文本分析和分词处理。例子中使用的是`StandardAnalyzer`,适用于英文文本。对于中文等其他语言,可能需要...
1. 初始化:创建Analyzer,用于分词;创建Directory,作为索引的存储位置,如内存目录RAMDirectory或磁盘上的FSDirectory。 2. 创建索引:创建IndexWriter对象,设置Analyzer和Directory,然后逐个添加Document。每...
Spring Boot是由Pivotal团队提供的全新框架,其设计目标是简化Spring应用的初始搭建以及开发过程。通过自动配置和“起步依赖”(Starter POMs)特性,Spring Boot使得创建独立的、生产级别的基于Spring的应用程序变...
1. **初始化索引**: 创建索引目录,使用 IndexWriter 将文档数据写入索引。 2. **查询处理**: 用户在 `search.jsp` 输入查询,该页面将查询字符串发送到服务器。 3. **查询解析**: 后端服务接收到查询后,使用 ...
2. **创建索引**:在应用程序启动时,初始化索引写入器,将数据源中的信息转换为 Lucene 文档,并添加到索引中。 3. **索引更新**:当数据源有新增、修改或删除操作时,同步更新 Lucene 索引。 4. **实现搜索接口*...
1. **初始化索引**:首先,Lucene需要读取数据源(如文件或数据库),然后使用Analyzer进行文本分析,创建索引Writer对象,最后将文档添加到索引中。 2. **索引优化**:索引构建完成后,可能会进行优化操作,合并多...
总的来说,通过这段代码实例,我们可以了解到使用Lucene进行搜索的基本步骤,包括创建查询对象、初始化`IndexSearcher`、执行查询以及处理搜索结果。掌握这些基本操作,对于理解和应用Lucene进行全文检索至关重要。