添加如下的maven依赖:
<dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>6.1.0</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>6.1.0</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>6.1.0</version> </dependency> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-demo</artifactId> <version>6.1.0</version> </dependency>
例子:
package com.tch.test.lucene; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.Date; 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.Field.Store; import org.apache.lucene.document.LongPoint; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; 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.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; public class MyLuceneTest { /** * '文件内容'的索引名词 */ public static final String CONTENT_INDEX_NAME = "contents"; /** * '文件修改时间'的索引名词 */ public static final String MODIFIED_INDEX_NAME = "modified"; /** * '文件路径'的索引名词 */ public static final String PATH_INDEX_NAME = "path"; public static void main(String[] args) throws Exception { String indexPath = "/media/tch/disk1/study/temp/lucene-index"; index("/media/tch/disk1/study/mytigase", indexPath); search(indexPath, "handleRichMJPacket"); } /** * 建立索引 * @param filePath 被索引的目录 * @param indexPath 索引存放目录 * @param create * @throws IOException */ public static void index(String filePath, String indexPath) throws IOException { System.out.println("开始在目录 '" + indexPath + "' 下面建立索引文件..."); final Path path = Paths.get(filePath); Date start = new Date(); //获取IndexWriter IndexWriter writer = getIndexWriter(indexPath); index4Folder(writer, path); // writer.forceMerge(1); writer.close(); System.out.println("创建索引一共用了" + (new Date().getTime() - start.getTime())/1000 + " 秒"); } /** * 获取IndexWriter * @param docDir * @param indexPath * @return * @throws IOException */ public static IndexWriter getIndexWriter(String indexPath) throws IOException{ return new IndexWriter(FSDirectory.open(Paths.get(indexPath)), getIndexWriterConfig()); } /** * 获取IndexWriterConfig * @return */ public static IndexWriterConfig getIndexWriterConfig(){ IndexWriterConfig indexWriterConfig = new IndexWriterConfig(getAnalyzer()); indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND); return indexWriterConfig; } /** * 为指定目录的所有文件创建索引 * @param writer * @param path * @throws IOException */ public static void index4Folder(final IndexWriter writer, Path path) throws IOException { if (Files.isDirectory(path)) { Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { try { index4File(writer, file.toUri().getPath(), attrs.lastModifiedTime().toMillis()); } catch (IOException ignore) { // don't index files that can't be read. } return FileVisitResult.CONTINUE; } }); } else { index4File(writer, path.toUri().getPath(), Files.getLastModifiedTime(path).toMillis()); } } /** * 为单个文件创建索引 * @param writer * @param file * @param lastModified * @throws IOException */ public static void index4File(IndexWriter writer, String filePath, long lastModified) throws IOException { System.out.println("开始为文件 " + filePath + " 创建索引"); Document document = new Document(); //文件路径 document.add(new StringField(PATH_INDEX_NAME, filePath, Field.Store.YES)); //修改时间 document.add(new LongPoint(MODIFIED_INDEX_NAME, lastModified)); //文件内容 document.add(new TextField(CONTENT_INDEX_NAME, getFileContent(filePath), Store.YES)); if (writer.getConfig().getOpenMode() == OpenMode.CREATE) { //添加doc writer.addDocument(document); } else { //更新doc writer.updateDocument(new Term("path", filePath), document); } } public static String getFileContent(String filePath) throws IOException{ StringBuilder builder = new StringBuilder(""); BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8)); String line = null; while((line = bufferedReader.readLine()) != null){ builder.append(line); builder.append("\r\n"); } } finally { if(bufferedReader != null){ bufferedReader.close(); } } return builder.toString(); } /** * 通过索引搜索字符串 * @param indexPath * @param targetString * @throws Exception */ public static void search(String indexPath, String targetString) throws Exception { //在索引的contents字段上面进行搜索 String indexField = "contents"; search(indexPath, targetString, indexField); } /** * 通过索引搜索字符串 * @param indexPath 索引存放路径 * @param searchStr 要搜索的字符串 * @throws Exception */ public static void search(String indexPath, String searchStr, String indexField) throws Exception { //解析器 QueryParser parser = new QueryParser(indexField, getAnalyzer()); //Query Query query = parser.parse(searchStr); //索引reader IndexReader reader = getIndexReader(indexPath); //索引搜索器 IndexSearcher searcher = new IndexSearcher(reader); doSearch(searcher, query); reader.close(); } /** * 根据搜索字符串和索引列名称获取Query * @param searchStr * @param indexField * @return * @throws ParseException */ public static Query getQuery(String searchStr, String indexField) throws ParseException{ //解析器 QueryParser parser = new QueryParser(indexField, getAnalyzer()); return parser.parse(searchStr); } /** * 获取IndexReader * @param indexPath 索引存放路径 * @return * @throws IOException */ public static IndexReader getIndexReader(String indexPath) throws IOException{ return DirectoryReader.open(FSDirectory.open(Paths.get(indexPath))); } /** * 获取Analyzer * @return */ public static Analyzer getAnalyzer(){ return new StandardAnalyzer(); } /** * 执行搜索 * @param searcher * @param query * @throws IOException */ public static void doSearch(IndexSearcher searcher, Query query) throws IOException { TopDocs results = searcher.search(query, 50); ScoreDoc[] hits = results.scoreDocs; System.out.println("一共搜索到 " + results.totalHits + " 条结果, 下面展示 " + hits.length + "条结果"); for (int i = 0; i < hits.length; i++) { //System.out.println("doc=" + hits[i].doc + " score=" + hits[i].score); Document document = searcher.doc(hits[i].doc); System.out.println((i + 1) + ". 文件路径: " + document.get(PATH_INDEX_NAME)); System.out.println((i + 1) + ". 文件内容: " + document.get(CONTENT_INDEX_NAME)); } } }
相关推荐
标题中的“Lucene对本地文件多目录创建索引”指的是使用Apache Lucene库来构建一个搜索引擎,该搜索引擎能够索引本地计算机上的多个文件目录。Lucene是一个强大的全文搜索库,它允许开发者在Java应用程序中实现高级...
通常我们选择FSDirectory,将索引存储在本地文件系统。 3. 创建文档对象:为每份要索引的数据创建一个Document对象,添加字段并赋值。 4. 添加文档到索引:使用IndexWriter对象将Document对象添加到索引目录中。...
在 Lucene 的使用过程中,创建索引是关键步骤,而有时我们需要查看这些索引来了解其结构、内容以及优化搜索性能。这就是"Lucene 索引 查看 工具"的用途,它可以帮助我们分析和理解 Lucene 索引的工作原理。 主要...
该程序旨在提供快速、准确的本地文件搜索服务,尽管目前仍存在一些待优化之处,如界面运行速度较慢,但其核心功能已经初具雏形。 Lucene,由Apache软件基金会开发,是一款开源全文检索库,广泛应用于各种搜索引擎的...
《基于Lucene和HDFS的PB级数据索引、搜索、存储系统》 在当今大数据时代,处理PB级别的数据已经成为常态。为了有效地管理和利用这些海量数据,我们需要强大的数据索引、搜索和存储解决方案。这里我们将深入探讨一个...
### Lucene创建与搜索索引...通过以上介绍,我们可以看到Lucene不仅提供了强大的索引和搜索功能,而且具有高度的灵活性和可扩展性,适用于各种规模的应用场景。希望本文能够帮助读者更好地理解和掌握Lucene的基本用法。
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了一个简单的API来索引和搜索大量文本数据。Heritrix,另一方面,是一个开源的互联网档案爬虫,能够系统地抓取网页并保存为离线资源,以便于后续...
在"lucene工程"中,我们可以通过实例学习到如何利用Lucene进行分词和构建索引,以及执行搜索操作。 一、分词 在信息检索领域,分词是将连续的文本分割成独立的词语单元,这些单元通常被称为“词元”或“Token”。...
Lucene可以被嵌入到各种应用中,为它们添加全文索引和搜索功能。这个库不仅包含了对文本的索引,还提供了高效的搜索算法,使得用户可以快速地查找和定位到相关的文档或内容。 在这个"ssh+lucene搜索实例"中,我们...
通过以上步骤,我们可以构建一个功能完备且高效的桌面搜索引擎,帮助用户快速地在海量的本地文件中找到所需信息。利用Lucene的强大功能,不仅可以实现基础的全文搜索,还能进行高级查询,如短语搜索、通配符搜索和...
本篇将详细介绍一个基于Apache Lucene的小型搜索引擎的构建过程,包括数据获取、处理和索引建立,以及用户界面的实现。 首先,搜索引擎的核心在于数据源。在这个项目中,数据源自百度音乐,通过Heritrix网络爬虫...
在这个项目中,索引被存放在C盘根目录下,这表明LUCENE的配置是将索引文件存储在本地文件系统上,方便快速访问。为了实现搜索功能,开发人员需要编写代码来读取数据库中的商品信息,使用LUCENE API创建和更新索引,...
2. **核心组件**:Lucene作为核心组件负责文档索引和查询操作,通过其提供的API可以方便地实现复杂的搜索逻辑。 3. **用户界面**:考虑到易用性和美观性,采用Swing或JavaFX框架来构建图形用户界面,实现与用户的...
标题中的“lucene地理位置搜索所用jar包”指的是Apache Lucene库在实现地理位置搜索功能时所需的特定Java档案(jar)文件。Lucene是开源的全文搜索引擎库,它为开发者提供了强大的文本检索和分析功能。在扩展到处理...
若索引必须存储在远程文件系统上,一个有效的策略是在本地文件系统上先建立索引,之后再将其复制到远程位置。这样能避免远程I/O带来的延迟,显著提升索引构建速度。 #### 升级硬件设备 投资更快的硬件,尤其是更快...
在Java环境下,Lucene提供了一种简单但功能强大的工具,用于索引和搜索文本数据。本项目的目标是实现一个基于Swing的简单应用,展示如何利用Lucene进行中文分词和全文索引的创建。 1. **Lucene的架构** Lucene的...
8. **概要设计**: 概要设计文档描述了系统的主要结构和组件,包括Lucene搜索引擎如何与GUI交互,数据如何被索引和存储,以及搜索算法的概述。 在实际应用中,基于Lucene的搜索引擎可能会涉及以下技术点: - **分词...
Lucene支持多线程操作,可以在高并发环境下高效地处理索引和查询任务,确保系统的稳定性。 7. **内存管理和性能优化** Lucene采用了高效的内存管理策略,如使用RAMDirectory和MMapDirectory进行索引存储,以及...
以上就是 Lucene 创建索引和进行全文搜索的基本流程。通过熟练掌握这些步骤,开发者可以构建出高效、灵活的全文搜索引擎。在实际应用中,还需要考虑更复杂的场景,如多线程索引、更新与删除文档、优化索引以及高级...