第一个Lucene例子,使用lucene-4.0.0,中文查询没有结果。
1.创建索引
package lucene.index; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.LongField; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; /** * 创建文档索引 * 步骤1:创建Lucene Index Writer * 步骤2:索引文档 */ public class Indexer { /* * 创建索引的目录 */ private String indexDir = "F:/project/Lucene/index"; /* * 文档目录 */ private String dataDir = "F:/project/Lucene/docs"; /* * 是否第一次创建索引 */ private boolean create = true; /* * 这个类负责创建索引或打开已有索引,以及向索引中添加、删除或更新被索引文档的信息。 提供针对索引文件的写入操作,但不能读取或搜索索引。 */ private IndexWriter writer; /** * 创建Lucene Index Writer * 步骤1:Directory创建索引存放的位置 * 步骤2:创建分析器Analyzer * 步骤3:配置IndexWriterConfig,使用分析器Analyzer * 步骤4:创建IndexWriter,使用Directory和IndexWriterConfig */ public Indexer() throws IOException { /* * 它是一个抽象类,它的子类负责具体指定索引的存储路径。 */ Directory dir = FSDirectory.open(new File(indexDir)); /* * 分析器,它负责从被索引文本文件中提取语汇单元,并剔除剩下的无用信息。 */ Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40); IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40, analyzer); if (create) { iwc.setOpenMode(OpenMode.CREATE); } else { iwc.setOpenMode(OpenMode.CREATE_OR_APPEND); } iwc.setInfoStream(System.out); writer = new IndexWriter(dir, iwc); } /** * 关闭Lucene Index Writer */ public void close() throws IOException { writer.close(); } /** * 索引文档 * 步骤1:找到文档目录下所有文件 * 步骤2:循环每个文档,如果是txt文档则步骤3,否则继续循环,或到步骤6 * 步骤3:文档作为输入流FileInputStream,创建Document,为Document添加多个域 * 步骤4:创建或更新索引文档 * 步骤5:关闭输入流 * 步骤6:返回索引文档的数目 */ public int index() throws Exception { File[] files = new File(dataDir).listFiles(); for (File f : files) { FileInputStream fis = null; try { /* * 只索引目录下所有txt文档 */ if (!f.isDirectory() && !f.isHidden() && f.exists() && f.canRead() && f.getName().toLowerCase().endsWith(".txt")) { System.out.println("Indexing " + f.getCanonicalPath()); fis = new FileInputStream(f); /* * Document对象代表Field的集合。文档的Field代表文档或文档相关的一些元数据。 */ Document doc = new Document(); /* * TextField、StringField、LongField等Field是包含能被索引的文本内容的类。每个Field包含一个名称和值,以及一组选项来控制Lucene索引操作各个域值。 */ doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8")))); doc.add(new StringField("filename", f.getName(), Field.Store.YES)); doc.add(new StringField("fullpath", f.getCanonicalPath(), Field.Store.YES)); doc.add(new LongField("modified", f.lastModified(), Field.Store.NO)); if (writer.getConfig().getOpenMode() == OpenMode.CREATE) { System.out.println("adding " + f); writer.addDocument(doc); } else { System.out.println("updating " + f); writer.updateDocument(new Term("path", f.getPath()), doc); } } } finally { if (fis != null) { fis.close(); } } } return writer.numDocs(); } public static void main(String[] args) throws Exception { Indexer indexer = null; int numIndexed; long start = System.currentTimeMillis(); try { indexer = new Indexer(); numIndexed = indexer.index(); } finally { if (indexer != null) { indexer.close(); } } long end = System.currentTimeMillis(); System.out.println("Indexing " + numIndexed + " files took " + (end - start) + " milliseconds"); } }
2.搜索
package lucene.index; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; /** * 搜索文档 * 步骤1:创建IndexReader * 步骤2:创建IndexSearcher * 步骤3:创建Query * 步骤4:搜索searcher.search */ public class Searcher { /* * 索引存放目录 */ private String indexDir = "F:/project/Lucene/index"; /** * 搜索 * * @param 搜索的域名 * ,如contents或filename * @param 搜索的值 */ public void search(String where, String q) throws IOException, ParseException { IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexDir))); /* * 用于搜索由IndexWriter类创建的索引 */ IndexSearcher searcher = new IndexSearcher(reader); /* * Query 方法一 */ Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40); QueryParser parser = new QueryParser(Version.LUCENE_40, where, analyzer); /* * Lucene含有许多具体的Query子类,TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、TermRangeQuery、NumericRangeQuery、FilteredQuery和SpanQuery * */ Query query1 = parser.parse(q); /* * Query 方法二 */ /* * TermQuery是Lucene提供的最基本的查询类型,也是简单查询类型之一。用来匹配指定域中包含特定项的文档。 */ Query query2 = new TermQuery(new Term(where, q)); long start = System.currentTimeMillis(); /* * 一个简单的指针容器,指向前N个排名的搜索结果。 */ TopDocs hits = searcher.search(query1, null, 10); long end = System.currentTimeMillis(); System.err.println("Found " + hits.totalHits + " document(s) (in " + (end - start) + " milliseconds) that matched query '" + q + "':"); for (ScoreDoc scoreDoc : hits.scoreDocs) { Document doc = searcher.doc(scoreDoc.doc); System.out.println(doc.get("fullpath")); System.out.println(doc.get("filename")); } } public static void main(String[] args) throws IOException, ParseException { Searcher searcher = new Searcher(); searcher.search("filename", "b.txt"); searcher.search("contents", "abc"); } }
相关推荐
1. **创建索引**:这是Lucene工作的第一步,它会把文档内容解析成一系列的术语(tokens),然后为每个术语建立倒排索引。倒排索引是一种数据结构,它允许快速查找包含特定术语的文档。 2. **索引写入**:在创建索引...
1. **索引创建**:这是搜索引擎的第一步,我们需要遍历要索引的数据源(例如文件系统、数据库等),读取内容,并使用Lucene的Analyzer进行分词,然后创建Term(词项)和Document(文档)。Analyzer是负责文本分析的...
总之,"lucene检索小例子"是一个实用的教程,通过它你可以学习到如何利用Lucene这一强大的全文搜索引擎库,实现高效、精准的文本检索功能。无论是在网站、数据库还是其他任何需要搜索功能的应用中,Lucene都是一个...
《Lucene实战(第2版) PDF高清中文版.pdf》这本书是关于Apache Lucene的一本经典教程,适合初学者入门。Lucene是一个全文搜索引擎库,它提供了强大的文本搜索功能,被广泛应用于各种信息检索系统中。这本书详细介绍了...
首先,`Lucene5`是一个强大的全文搜索引擎库,由Apache软件基金会开发。它提供了核心的搜索功能,如索引、查询解析、评分和排序,被广泛应用于各种项目中。在`Lucene5`中,文本预处理是非常关键的步骤,其中包括分词...
《Lucene in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Apache Lucene这个全文搜索引擎库的使用和实现细节。这本书的实例代码涵盖了Lucene的核心功能和高级用法,是学习Lucene不可或缺的参考资料。...
Lucene是一个高性能、全文检索库,它提供了强大的文本分析和索引功能,广泛应用于搜索引擎开发和其他需要高效文本处理的场景。本篇文章主要面向初学者,通过实例详细解释如何使用Lucene进行文档搜索。 首先,我们...
分词是搜索引擎处理文本的第一步,Lucene内置了多种分词器,如StandardAnalyzer,它可以根据语言特性对文本进行切分。分词后,Lucene会统计每个词在文档中的出现频率,形成词频信息。然后,Lucene会构建倒排索引,将...
在Lucene中,建立索引是搜索的第一步。首先,我们需要创建一个`IndexWriter`实例,这是负责写入索引的主要类。`IndexWriter`配置包括分词器(Tokenizer)、分析器(Analyzer)和目录(Directory)。分词器将文档内容...
★2) 块由若干文档(Document)组成: 一个文件映射成一个文档。数据库表中的一条记录映射成一个文档。 ★3) 文档由若干域(Field)组成:文件的属性(文件路径,文件的内容)映射成一个域。记录的某个字段映射成一个域。...
// 第一个参数是存储目录 // 第二个参数是分析器(用于分析文档内容) // 第三个参数表示是否为新建索引(true新建,false追加) // 第四个参数是字段长度限制 IndexWriter indexWriter = new IndexWriter(dir, new ...
《Lucene in Action》第二版是一本全面介绍Apache Lucene 3.0的书籍,它被誉为是美国大学搜索引擎课程的标准教材之一。本书由Michael McCandless、Erik Hatcher和Otis Gospodnetic三位作者共同编写,并得到了Apache ...
1. **索引构建**:Lucene的核心功能之一是创建倒排索引,这是一种高效的数据结构,用于快速查找文档中包含特定词项的信息。这部分可能会讲解如何使用Lucene API来添加文档、分词、创建倒排索引以及优化索引过程。 2...
描述中的“LuceneChapter12 光盘使用说明.DOC”可能是指一份包含第12章内容的文档,这部分可能详细解释了如何在实际操作中运用Lucene和Nutch,尤其是光盘中的资源如何被利用。 **Lucene详解** Apache Lucene是一个...
- 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **索引数据术语和约定**:...
##### 3.1 第一部分:入门篇 这部分内容旨在帮助读者快速了解 Lucene 的基本概念和工作原理。包括但不限于: - **第 1 章:简介**:介绍 Lucene 的历史和发展现状,解释为什么选择使用 Lucene。 - **第 2 章:快速...
当Lucene的第一次打五年前的场景,这是令人惊叹的。通过使用这个开源的,高度可扩展,超快速的搜索引擎,开发人员可以集成到应用程序的搜索快速,高效。已经改变了很多,因为当时搜索到大多数企业应用程序中不可或缺...
在第一部分“Core Lucene”中,作者首先介绍了Lucene的基本概念和用途,帮助读者理解Lucene的核心功能。这部分可能包括以下几个关键知识点: 1. **Lucene简介**:Lucene作为一个高性能的全文检索库,它的主要功能是...
在书中,作者首先从第1章开始介绍Lucene的基础,包括Lucene的起源、核心概念,如索引、文档、字段和分词,以及如何构建一个简单的Lucene应用程序。这为读者提供了对Lucene搜索引擎的基本认识,并建立起对后续章节...