Lucene4.2.1示例,之前也做过3.6的示例。3.6的分词需要使用IKAnalyzer或者其他的分词,对中文的支持可能才会更好,但是4.2为我们提供了SmartChineseAnalyzer这个中文分词器。
下面是一个简单的示例程序,分别对应增删改查:
package com.xiva.test.lucene; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; 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.store.Directory; import org.apache.lucene.store.SimpleFSDirectory; import org.apache.lucene.util.Version; public class IvFileIndex { private static List<File> fileList = new ArrayList<File>(1024); public static void listAllFile(File fileDir) { File[] files = fileDir.listFiles(); for (File file : files) { if (file.isDirectory()) { listAllFile(file); } else { fileList.add(file); } } } public static void main(String[] args) throws Exception { File fileDir = new File("F:\\WorkSpace"); File indexDir = new File("F:\\WorkSpace\\EclipseProjects\\luceneIndex"); Analyzer luceneAnalyzer = new SmartChineseAnalyzer(Version.LUCENE_42); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, luceneAnalyzer); config.setOpenMode(org.apache.lucene.index.IndexWriterConfig.OpenMode.CREATE); Directory fsDir = new SimpleFSDirectory(indexDir); IndexWriter indexWriter = new IndexWriter(fsDir, config); listAllFile(fileDir); long startTime = new Date().getTime(); indexWriter.deleteAll(); // 增加document到索引去 for (File txtFile : fileList) { if (txtFile.isFile() && txtFile.getName().endsWith(".java")) { System.out.println(txtFile.getName()); FileInputStream fis = null; try { fis = new FileInputStream(txtFile); } catch (FileNotFoundException fnfe) { continue; } try { Document document = new Document(); Field fieldPath = new StringField("path", txtFile.getPath(), Field.Store.YES); Field fieldBody = new TextField("body", new BufferedReader(new InputStreamReader(fis, "GBK"))); document.add(fieldPath); document.add(fieldBody); indexWriter.addDocument(document); } finally { fis.close(); } System.out.println("被索引文件:" + txtFile.getCanonicalPath()); } } // 对索引进行优化 indexWriter.forceMerge(10); indexWriter.close(); // 测试一下索引的时间 long endTime = new Date().getTime(); System.out.println("索引耗费时间:" + (endTime - startTime) + " 毫秒!"); } }
package com.xiva.test.lucene; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Date; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.SimpleFSDirectory; import org.apache.lucene.util.Version; /** * * 删除索引 * @author xiva * @version [版本号, 2013-4-30] * @see [相关类/方法] * @since [产品、模块版本] */ public class IvIndexDelete { public static void main(String[] args) throws Exception { File fileDir = new File("E:\\data\\lucene"); File indexDir = new File("E:\\data\\index"); Analyzer luceneAnalyzer = new SmartChineseAnalyzer(Version.LUCENE_42); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, luceneAnalyzer); config.setOpenMode(org.apache.lucene.index.IndexWriterConfig.OpenMode.APPEND); Directory fsDir = new SimpleFSDirectory(indexDir); IndexWriter indexWriter = new IndexWriter(fsDir, config); File[] txtFiles = fileDir.listFiles(); long startTime = new Date().getTime(); // 增加document到索引去 for (int i = 0; i < txtFiles.length; i++) { if (txtFiles[i].isFile() && txtFiles[i].getName().endsWith("u.txt")) { FileInputStream fis = null; try { fis = new FileInputStream(txtFiles[i]); } catch (FileNotFoundException fnfe) { continue; } try { indexWriter.deleteDocuments(new Term("path", txtFiles[i].getPath())); } finally { fis.close(); } System.out.println("被删除索引文件:" + txtFiles[i].getCanonicalPath()); } } indexWriter.forceMerge(10); indexWriter.close(); //测试一下索引的时间 long endTime = new Date().getTime(); System.out.println("删除索引耗费时间:" + (endTime - startTime) + " 毫秒!"); } }
package com.xiva.test.lucene; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.util.Date; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; 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.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.SimpleFSDirectory; import org.apache.lucene.util.Version; public class IvIndexUpdate { public static void updateIndex() throws Exception { File fileDir = new File("E:\\data\\lucene"); File indexDir = new File("E:\\data\\index"); Analyzer luceneAnalyzer = new SmartChineseAnalyzer(Version.LUCENE_42); IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_42, luceneAnalyzer); config.setOpenMode(org.apache.lucene.index.IndexWriterConfig.OpenMode.APPEND); Directory fsDir = new SimpleFSDirectory(indexDir); IndexWriter indexWriter = new IndexWriter(fsDir, config); File[] txtFiles = fileDir.listFiles(); long startTime = new Date().getTime(); // 增加document到索引去 for (int i = 0; i < txtFiles.length; i++) { if (txtFiles[i].isFile() && txtFiles[i].getName().endsWith("u.txt")) { FileInputStream fis; try { fis = new FileInputStream(txtFiles[i]); } catch (FileNotFoundException fnfe) { continue; } try { Document document = new Document(); Field fieldPath = new StringField("path", txtFiles[i].getPath(), Field.Store.YES); Field fieldBody = new TextField("body", new BufferedReader(new InputStreamReader(fis, "GBK"))); document.add(fieldPath); document.add(fieldBody); indexWriter.updateDocument(new Term("path", txtFiles[i].getPath()), document); } finally { fis.close(); } System.out.println("被更新索引文件:" + txtFiles[i].getCanonicalPath()); } } indexWriter.forceMerge(10); indexWriter.close(); // 测试一下索引的时间 long endTime = new Date().getTime(); System.out.println("更新索引耗费时间:" + (endTime - startTime) + " 毫秒!"); } public static void main(String[] args) throws Exception { updateIndex(); } }
package com.xiva.test.lucene; import java.io.File; import java.io.IOException; import java.util.Date; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; 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.TopDocs; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class IvFileSearch { public static void main(String[] args) throws IOException { String queryString = "索引"; String field = "body"; Query query = null; TopDocs docs = null; File indexDir = new File("F:\\WorkSpace\\EclipseProjects\\luceneIndex"); IndexReader reader = DirectoryReader.open(FSDirectory.open(indexDir)); IndexSearcher searcher = new IndexSearcher(reader); // StopFilterFactory factory = new StopFilterFactory(); // factory.getStopWords() Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_42); try { long startTime = new Date().getTime(); QueryParser qp = new QueryParser(Version.LUCENE_42, field, analyzer); query = qp.parse(queryString); long endTime = new Date().getTime(); System.out.println("索引耗费时间:" + (endTime - startTime) + " 毫秒!"); } catch (ParseException e) { e.printStackTrace(); } if (searcher != null) { docs = searcher.search(query, 25);// 可以分页查询 ScoreDoc scoreDocs[] = docs.scoreDocs; for (int i = 0; i < docs.totalHits; i++) { Document targetDoc = searcher.doc(scoreDocs[i].doc); String path = targetDoc.get("path"); System.out.println("path:" + path); } } } }
PS:对于数据库操作时,相信大家都有相关的方法去更新或者删除索引,比如及时更新或者使用定时扫描表的方法。数据库本身也具有全文索引的特性,比如Oracle和MSSQL。
对与文件的操作,我的解决方法是:可以采用 利用JNA对文件进行监听之观察者模式 这里给出的方法来更新或者删除索引。
相关推荐
这个"Lucene.NET全文索引搜索Demo项目"是一个实际应用示例,展示了如何在.NET环境中使用Lucene.NET进行全文索引和搜索操作。 首先,我们要理解什么是全文索引。全文索引是一种特殊的数据库索引,它允许用户通过输入...
《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...
《Lucene索引小示例解析》 Lucene是一个高性能、全文检索库,它由Apache软件基金会开发并维护。在Java编程环境中,Lucene被广泛应用于构建搜索功能,特别是对于大量文本数据的高效检索。本篇文章将通过一个简单的小...
**Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...
同时,`HelloLucene_delete`这个压缩包文件可能是某个示例项目,通过分析其中的代码,你可以更直观地了解Lucene删除索引的实现方式。 总之,Lucene的删除索引机制是一个复杂但高效的过程,涉及到了位向量、段管理和...
Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了强大的搜索功能,并且被广泛应用于各种项目中,包括网站站内搜索。本示例提供了使用 Lucene 实现站内搜索的具体步骤和代码示例,帮助开发者...
在"Lucene全文搜索_LuceneJava全文搜索_"这个主题中,我们将深入探讨Lucene如何在Java环境中实现高效的全文搜索引擎。首先,Lucene的核心概念包括文档(Document)、字段(Field)、索引(Index)和搜索(Search)。...
“Lucene与数据库结合示例(加双关键字高亮)”这个标题表明,我们将讨论如何将开源全文搜索引擎Lucene与关系型数据库MySQL整合在一起,并且在搜索结果中实现关键词高亮显示,以提升用户体验。这通常涉及到数据的...
本示例项目“lucene4.4的搜索示例”旨在帮助开发者快速理解和使用 Lucene 的核心功能,包括索引构建、查询解析以及结果排序。 首先,我们来看索引构建过程。在 Lucene 中,数据并不是直接存储的,而是通过构建索...
Lucene是Apache软件基金会的开源全文检索库,它提供了强大的文本分析和索引构建能力。在本示例中,作者使用Spring和Struts1作为框架,MySQL作为后台数据存储。 1. **Lucene中文分词**: Lucene本身支持英文的分词...
在版本 4.8 中,Lucene 提供了强大的文本分析、索引构建和搜索功能,使得开发者能够轻松地在应用程序中集成高效的全文搜索引擎。本文将详细介绍 Lucene 4.8 的基本概念、关键组件以及如何通过实例进行入门。 一、...
Lucene 是一个强大的全文检索库,通过索引、搜索、分析等机制,为开发者提供高效的数据搜索能力。"lucene示例"可以帮助初学者理解并实践 Lucene 的主要功能,而提供的 jar 包则是运行 Lucene 应用的基础。学习并掌握...
4. **Document** 和 **Field** 类:Document是Lucene中的基本数据结构,代表一个要被索引的完整文档。每个文档包含多个Field,每个Field对应文档的一个属性或部分。 5. **IndexWriter**:用于创建或更新索引。你...
以下是一个简单的Lucene索引创建示例: ```java Directory indexDir = FSDirectory.open(new File(INDEXDIR)); IndexWriter writer = new IndexWriter(indexDir, analyzer, true, MaxFieldLength.LIMITED); File ...
在这个“Lucene全文检索的各种例子”中,我们将探讨如何使用不同的分词器,如ikAnalyzer和smartChineseAnalyzer,来实现中文文本的索引和搜索。 首先,让我们深入理解一下Lucene。Lucene的核心功能包括文档的索引和...
本文将详细介绍如何利用Lucene对XML文档进行索引建立的过程,并通过示例代码具体阐述其实现方法。 #### 二、基础知识 1. **Lucene简介** - Lucene是一个开源的全文搜索引擎库,能够帮助开发者构建应用程序内的搜索...
以下是一个简单的Java代码示例,展示了如何创建和使用Lucene索引器: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache....
这个“lucene全文索引”可能是包含Lucene的相关示例代码、文档或者配置文件,帮助用户更好地理解和使用Lucene。 **1. Lucene 的基本概念** - **索引**: 在Lucene中,索引是预处理步骤,将原始文本转换为倒排索引...
本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、执行查询,并比较默认的TF-IDF相似度与BM25相似度的区别。 首先,我们需要了解什么是Lucene。Lucene是一个由...