`
dreamoftch
  • 浏览: 495528 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lucene在本地文件建索引和搜索

阅读更多

 

 

添加如下的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对本地文件多目录创建索引

    标题中的“Lucene对本地文件多目录创建索引”指的是使用Apache Lucene库来构建一个搜索引擎,该搜索引擎能够索引本地计算机上的多个文件目录。Lucene是一个强大的全文搜索库,它允许开发者在Java应用程序中实现高级...

    lucene全文检索简单索引和搜索实例

    通常我们选择FSDirectory,将索引存储在本地文件系统。 3. 创建文档对象:为每份要索引的数据创建一个Document对象,添加字段并赋值。 4. 添加文档到索引:使用IndexWriter对象将Document对象添加到索引目录中。...

    lucene 索引 查看 工具

    在 Lucene 的使用过程中,创建索引是关键步骤,而有时我们需要查看这些索引来了解其结构、内容以及优化搜索性能。这就是"Lucene 索引 查看 工具"的用途,它可以帮助我们分析和理解 Lucene 索引的工作原理。 主要...

    lucene做的桌面搜索

    该程序旨在提供快速、准确的本地文件搜索服务,尽管目前仍存在一些待优化之处,如界面运行速度较慢,但其核心功能已经初具雏形。 Lucene,由Apache软件基金会开发,是一款开源全文检索库,广泛应用于各种搜索引擎的...

    基于Lucene和HDFS的PB级数据索引、搜索、存储系统.zip

    《基于Lucene和HDFS的PB级数据索引、搜索、存储系统》 在当今大数据时代,处理PB级别的数据已经成为常态。为了有效地管理和利用这些海量数据,我们需要强大的数据索引、搜索和存储解决方案。这里我们将深入探讨一个...

    Lucene创建与搜索索引

    ### Lucene创建与搜索索引...通过以上介绍,我们可以看到Lucene不仅提供了强大的索引和搜索功能,而且具有高度的灵活性和可扩展性,适用于各种规模的应用场景。希望本文能够帮助读者更好地理解和掌握Lucene的基本用法。

    lucene_heritrix 搜索引擎

    Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了一个简单的API来索引和搜索大量文本数据。Heritrix,另一方面,是一个开源的互联网档案爬虫,能够系统地抓取网页并保存为离线资源,以便于后续...

    lucene工程,分词、索引

    在"lucene工程"中,我们可以通过实例学习到如何利用Lucene进行分词和构建索引,以及执行搜索操作。 一、分词 在信息检索领域,分词是将连续的文本分割成独立的词语单元,这些单元通常被称为“词元”或“Token”。...

    ssh+lucene搜索实例

    Lucene可以被嵌入到各种应用中,为它们添加全文索引和搜索功能。这个库不仅包含了对文本的索引,还提供了高效的搜索算法,使得用户可以快速地查找和定位到相关的文档或内容。 在这个"ssh+lucene搜索实例"中,我们...

    基于lucene的桌面搜索引擎

    通过以上步骤,我们可以构建一个功能完备且高效的桌面搜索引擎,帮助用户快速地在海量的本地文件中找到所需信息。利用Lucene的强大功能,不仅可以实现基础的全文搜索,还能进行高级查询,如短语搜索、通配符搜索和...

    基于Lucene的小型搜索引擎

    本篇将详细介绍一个基于Apache Lucene的小型搜索引擎的构建过程,包括数据获取、处理和索引建立,以及用户界面的实现。 首先,搜索引擎的核心在于数据源。在这个项目中,数据源自百度音乐,通过Heritrix网络爬虫...

    基于LUCENE 的全文搜索

    在这个项目中,索引被存放在C盘根目录下,这表明LUCENE的配置是将索引文件存储在本地文件系统上,方便快速访问。为了实现搜索功能,开发人员需要编写代码来读取数据库中的商品信息,使用LUCENE API创建和更新索引,...

    基于Lucene的桌面搜索软件

    2. **核心组件**:Lucene作为核心组件负责文档索引和查询操作,通过其提供的API可以方便地实现复杂的搜索逻辑。 3. **用户界面**:考虑到易用性和美观性,采用Swing或JavaFX框架来构建图形用户界面,实现与用户的...

    lucene地理位置搜索所用jar包

    标题中的“lucene地理位置搜索所用jar包”指的是Apache Lucene库在实现地理位置搜索功能时所需的特定Java档案(jar)文件。Lucene是开源的全文搜索引擎库,它为开发者提供了强大的文本检索和分析功能。在扩展到处理...

    Lucene索引优化

    若索引必须存储在远程文件系统上,一个有效的策略是在本地文件系统上先建立索引,之后再将其复制到远程位置。这样能避免远程I/O带来的延迟,显著提升索引构建速度。 #### 升级硬件设备 投资更快的硬件,尤其是更快...

    基于Lucene的全文搜索

    在Java环境下,Lucene提供了一种简单但功能强大的工具,用于索引和搜索文本数据。本项目的目标是实现一个基于Swing的简单应用,展示如何利用Lucene进行中文分词和全文索引的创建。 1. **Lucene的架构** Lucene的...

    基于Lucene的搜索引擎

    8. **概要设计**: 概要设计文档描述了系统的主要结构和组件,包括Lucene搜索引擎如何与GUI交互,数据如何被索引和存储,以及搜索算法的概述。 在实际应用中,基于Lucene的搜索引擎可能会涉及以下技术点: - **分词...

    lucene基本包

    Lucene支持多线程操作,可以在高并发环境下高效地处理索引和查询任务,确保系统的稳定性。 7. **内存管理和性能优化** Lucene采用了高效的内存管理策略,如使用RAMDirectory和MMapDirectory进行索引存储,以及...

    lucene索引

    以上就是 Lucene 创建索引和进行全文搜索的基本流程。通过熟练掌握这些步骤,开发者可以构建出高效、灵活的全文搜索引擎。在实际应用中,还需要考虑更复杂的场景,如多线程索引、更新与删除文档、优化索引以及高级...

Global site tag (gtag.js) - Google Analytics