package com.heming.lucene.process;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
/**
* 搜索
*
* @author 何明
*
*/
public class Search {
private String INDEX_STORE_PATH = "d:\\index";
/**
* 利用Lucene的搜索
*
* @param searchType
* 代表重要搜索的Filed
* @param searchKey
* 代表关键字
*/
public void indexSearch(String searchType, String searchKey) {
try {
// 根据索引位置建立 IndexSearcher
IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH);
// 建立搜索单元,searchType代表重要搜索的Filed,searchKey代表关键字
Term t = new Term(searchType, searchKey);
// 由Term生成一个Query
Query q = new TermQuery(t);
// 搜索开始时间
Date beginTime = new Date();
// 获取一个<document,frequency>的枚举对象TermDocs
TermDocs termDocs = searcher.getIndexReader().termDocs(t);
while (termDocs.next()) {
// 输出文件中出现关键词的次数
System.out.println(termDocs.freq());
// 输出搜索到关键词的文档
// System.out.println(searcher.getIndexReader().document(termDocs.doc()));
}
// 搜索完成时间
Date endTime = new Date();
// 搜索所耗时间
long timeOfSearch = endTime.getTime() - beginTime.getTime();
System.out.println("The time For indexsearch is " + timeOfSearch
+ "ms");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 利用String的搜索
*
* @param keyWord
* 关键词
* @param searchDir
* 搜索目录
*/
public void StringSearch(String keyWord, String searchDir) {
File filesDir = new File(searchDir);
// 返回目录文件夹所有文件数组
File[] files = filesDir.listFiles();
// HashMap保存文件名和匹配次数对
Map rs = new HashMap();
// 记录搜索开始时间
Date beginTime = new Date();
// 遍历所有文件
for (int i = 0; i < files.length; ++i) {
// 初始化匹次数
int hits = 0;
try {
// 读取文件内容
BufferedReader br = new BufferedReader(new FileReader(files[i]));
StringBuffer sb = new StringBuffer();
String line = br.readLine();
while (null != line) {
sb.append(line);
line = br.readLine();
}
br.close();
// 将StringBuffer转化成String,便于搜索
String stringToSearch = sb.toString();
// 初始化fromIndex
int fromIndex = -keyWord.length();
// 逐个匹配关键词
while (-1 != (fromIndex = stringToSearch.indexOf(keyWord,
fromIndex + keyWord.length()))) {
++hits;
}
// 将文件名和匹配次数加入HashMap中
rs.put(files[i].getName(), new Integer(hits));
} catch (Exception e) {
e.printStackTrace();
}
// 输出查询结果
Iterator it = rs.keySet().iterator();
while (it.hasNext()) {
String fileName = (String) it.next();
Integer hit = (Integer) rs.get(fileName);
// System.out.println("find" + hit.intValue() + "matches in "
// + fileName);
// ;
}
// 记录结束时间
Date endTime = new Date();
// 得到搜索耗费时间
long timeOfSearch = endTime.getTime() - beginTime.getTime();
System.out.println("The time For string search is " + timeOfSearch
+ "ms");
}
}
public static void main(String[] args) {
Search search = new Search();
// 通过索引搜索关键词
search.indexSearch("content", "String");
// 通过String的API搜索关键词
search.StringSearch("line", "d:\\test");
}
}
分享到:
相关推荐
**Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高性能、可扩展的信息检索服务。Lucene最初由Doug Cutting开发,现在已经成为Java社区中事实上的标准...
Lucene 可以与其他开源项目结合,如 Solr 提供了 Web 接口和集群支持,Elasticsearch 建立在 Lucene 之上,提供了更高级的分布式搜索和分析功能。 总之,Lucene 是一个强大的搜索引擎框架,通过理解和掌握其核心...
Lucene 的核心功能是接收一系列字符串输入,然后构建索引,为用户提供全文搜索服务,帮助定位关键词所在的位置。 【Lucene 应用场景】 Lucene 的应用场景广泛,可以用于站内新闻的搜索、数据库表字段的快速检索,...
Lucene在搜索过程中,首先需要建立索引。索引过程包括准备需要索引的文档、通过分词组件去除标点和停用词、通过语言处理组件进行词元处理(例如转换为小写和词根)、最后将处理后的词(Term)传给索引组件,生成字典...
### Lucene快速入门知识点 #### 1. Lucene简介 ##### 1.1 Lucene的历史 - **创始人**: Lucene由一位资深的全文索引/检索专家开发。 - **开源历程**: 最初发布在其个人主页上,2001年10月捐赠给Apache基金会,成为...
Lucene入门与系统架构** Lucene的入门课程介绍了如何快速上手使用Lucene,包括基本概念、环境搭建以及简单的索引和搜索操作。系统架构部分则深入解析了Lucene的工作原理,如倒排索引的构建、存储结构以及数据流处理...
doc.add(new TextField("title", "Lucene入门指南", Field.Store.YES)); doc.add(new StringField("author", "张三", Field.Store.YES)); doc.add(new IntField("year", 2023, Field.Store.YES)); ``` 这里我们创建...
为了帮助开发者更好地利用Lucene,本书还介绍了一系列工具和扩展,包括性能测试框架、管理工具等,这些都是构建高质量搜索系统的宝贵资源。 ### Lucene端口 对于那些希望在非Java环境中使用Lucene的开发者,书中也...
### Lucene in Action 第二版:深入探索 Java 搜索技术 #### 一、引言 《Lucene in Action》第二版是一本专为希望利用 Apache Lucene 进行高效搜索功能开发的技术人员编写的权威指南。本书由 Michael McCandless、...
#### 二、Lucene的入门实例 - 在本章节中,我们将学习如何安装和配置Lucene环境,包括下载最新版本的Lucene并设置相应的开发环境。 - 通过一个简单的示例来展示如何使用Lucene创建索引以及如何执行基本的全文搜索...
2. **文档分析(Document Analysis)**:在建立索引之前,Lucene会进行文本预处理,包括分词(Tokenization)、去除停用词(Stop Word Removal)、词形还原(Lemmatization)等步骤,以便更精确地匹配查询。...
- **接触Lucene**:介绍Lucene的基本概念和技术特点,适合初学者入门。 - **索引**:详解如何使用Lucene建立文档索引,包括索引的结构设计、存储策略等。 - **为程序添加搜索功能**:讲解如何将Lucene集成到现有的...
索引是Lucene对大量数据进行高效搜索的基础,它将原始文本转换成一系列可搜索的表示形式。在Lucene中,我们可以创建一个`IndexWriter`对象来添加文档到索引中。每个文档由多个字段(Field)组成,如标题、内容等,每...
"LuceneHelloWorld"通常是一个简单的入门程序,用于演示如何使用Lucene进行基本的索引和搜索操作。以下是一般步骤: 1. 引入依赖:首先,你需要在项目中引入Lucene的依赖库。 2. 创建索引:创建一个`Directory`...
这个压缩包提供的"lucene第一天"是一系列入门教程,旨在帮助初学者快速理解并掌握Lucene的核心概念和基本操作。 首先,让我们了解一下Lucene的基本组件和工作原理。Lucene的核心功能是索引和搜索文本数据。它将非...
Compass全文检索系列之一:Compass入门 在IT领域,全文检索已经成为数据分析和信息检索的重要技术,尤其是在大数据时代。本文将介绍Compass,一个基于Lucene的全文搜索引擎库,为Java开发者提供了一种简单易用的...
尽管Lucene本身不是一个完整的搜索引擎解决方案,但它提供了构建此类解决方案所需的基础组件。 - **全文检索系统的结构** 全文检索系统的基本结构通常包括以下几个部分: - 数据采集:获取文档或网页等数据源。 ...