建立索引:
package paoding;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
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.index.IndexWriter;
public class IndexFiles {
public static void main(String[] args) {
long start = System.currentTimeMillis();
try {
// 获取Paoding中文分词器
Analyzer analyzer = new PaodingAnalyzer();
// Analyzer analyzer = new StandardAnalyzer();
// indexWriter建立索引
IndexWriter writer = new IndexWriter("f:\\indexpaoding", analyzer, true,
IndexWriter.MaxFieldLength.UNLIMITED);
indexDocs(writer, new File("F:\\徐剛:28tel(繁firfox)"));
writer.optimize();
writer.close();
System.out.println("用时:" + (System.currentTimeMillis() - start)
+ " 毫秒");
} catch (IOException e) {
e.printStackTrace();
}
}
// 遍历文件夹文件,对需要的文件建立索引
static void indexDocs(IndexWriter writer, File file) throws IOException {
if (file.canRead()) {
if (file.isDirectory()) {
String[] files = file.list();
if (files != null) {
for (int i = 0; i < files.length; i++) {
indexDocs(writer, new File(file, files[i]));
}
}
} else {
if (file.getName().endsWith(".htm")
|| file.getName().endsWith(".html")
|| file.getName().endsWith(".jsp")
|| file.getName().endsWith(".php")
|| file.getName().endsWith(".txt")) {
System.out.println("添加 " + file);
try {
// 针对参数文件建立索引文档 ,一个Document就相当于一跳记录
Document doc = new Document();
// Field.Index.ANALYZED 文件名称 建立索引,分词
doc.add(new Field("filename", file.getCanonicalPath(),
Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.add(new Field("contents", ReadFile(file),
Field.Store.YES, Field.Index.ANALYZED,
Field.TermVector.WITH_POSITIONS_OFFSETS));
// new InputStreamReader(new
// FileInputStream(file.getCanonicalPath()), "utf-8")));
writer.addDocument(doc);
} catch (FileNotFoundException fnfe) {
;
}
}
}
}
}
// 用字符串形式,读取一个File的内容
public static String ReadFile(File f) {
String line = null;
StringBuffer temp = new StringBuffer();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(f), "utf-8"));
while ((line = br.readLine()) != null) {
temp.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return temp.toString();
}
}
用来搜索:并带简单分页效果
package paoding;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.TermPositionVector;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TopDocCollector;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.TokenGroup;
import org.apache.lucene.search.highlight.TokenSources;
public class SearchFiles {
/**
*
* @param key
* 搜索的关键字
* @param perPage
* 每页显示多少条记录
* @param begin
* 从第几页开始显示
* @throws CorruptIndexException
* @throws IOException
* @throws ParseException
*/
int CACHE_PAGE = 3; // 缓存的页面数
public void search(String key, int perPage, int begin)
throws CorruptIndexException, IOException, ParseException {
String IDNEX_PATH = "f:\\indexpaoding"; //索引所在目录
int total_Page = 0; // 总页数
// 获取Paoding中文分词器
Analyzer analyzer = new PaodingAnalyzer();
// Analyzer analyzer = new StandardAnalyzer();
// 检索
IndexReader reader = IndexReader.open(IDNEX_PATH);
Searcher searcher = new IndexSearcher(reader);
/* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行 */
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,
BooleanClause.Occur.SHOULD };
Query query = MultiFieldQueryParser.parse(key, new String[] {
"filename", "contents" }, clauses, analyzer);
// QueryParser parser = new QueryParser("contents", analyzer);
// Query query = parser.parse(key);
TopDocCollector collector = new TopDocCollector(perPage * CACHE_PAGE); // perPage
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
int numTotalHits = collector.getTotalHits();
System.out.println("符合查询词的文件数:" + numTotalHits);
// 获得总页数
if (numTotalHits % perPage != 0) {
total_Page = numTotalHits / perPage + 1;
} else {
total_Page = numTotalHits / perPage;
}
if (begin > total_Page) {
System.err.println("超出范围");
} else {
// 如果起始页大于缓存页,这就代表我们需要重新搜索更多的资源
if (begin > CACHE_PAGE) {
// 这时,我把搜索的资源都搜索出来,缓存页数=总页数
CACHE_PAGE = total_Page;
// 返回调用
search(key, perPage, begin);
// collector = new TopDocCollector( numTotalHits ); //缓存不够,重新搜索
// searcher.search(query, collector);
// hits = collector.topDocs().scoreDocs;
} else {
int temp = (begin - 1) * perPage + perPage;
if ((begin - 1) * perPage + perPage > numTotalHits) {
temp = numTotalHits;
}
// 根据参数,从指定的位置开始获取数据(用于分页)
for (int i = (begin - 1) * perPage; i < temp; i++) {
System.out.println(i);
int docId = hits[i].doc;
Document doc3 = searcher.doc(docId);
String filename = doc3.get("filename");
System.out.println("filename=" + filename);
// 高亮处理
String text = doc3.get("contents");
TermPositionVector tpv = (TermPositionVector) reader
.getTermFreqVector(hits[i].doc, "contents");
TokenStream ts = TokenSources.getTokenStream(tpv);
Formatter formatter = new Formatter() {
public String highlightTerm(String srcText, TokenGroup g) {
if (g.getTotalScore() <= 0) {
return srcText;
}
return "<b>" + srcText + "</b>";
}
};
Highlighter highlighter = new Highlighter(formatter,
new QueryScorer(query));
String result = highlighter.getBestFragments(ts, text, 5,
"…");
System.out.println("result:\n\t" + result);
}
System.out.println("循环结束");
}
}
reader.close();
System.out.println("关闭reader");
}
public static void main(String[] args) throws Exception {
SearchFiles sf = new SearchFiles();
sf.search("vvczvxcxz", 5, 1);
}
}
分享到:
相关推荐
**Lucene 全文搜索引擎实例:Java Lucene 实例** Lucene 是 Apache 软件基金会的一个开源项目,它提供了一个高性能、可扩展的信息检索库。这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索...
这个"lucene实例"的压缩包文件很可能是为了演示或教学如何使用Lucene进行文本检索和分析。Lucene的核心功能包括文档索引、搜索、排序以及相关性评分等,它被广泛应用于各种信息检索系统中,如网站搜索、企业内部信息...
Java搜索工具——Lucene实例总结(一) 在Java开发中,搜索引擎已经成为不可或缺的一部分,而Apache Lucene正是一个强大的全文搜索引擎库。这篇博文将带你深入理解Lucene的基本概念和使用方式,帮助你快速入门并掌握...
lucene实例是一个比较详细的例子,包括lucene的入门到高级实例,代码里有比较详细的实例,所有的实例都是通过junit来测试的。实例包括各种搜索:如通配符查询、模糊查询、查询结果的分页、中文分词器、自定义分词器...
经典的Lucene实例代码及详细解析以及Lucene结构流程介绍 Lucene是一个功能强大且灵活的开源搜索引擎库,它提供了一个简单易用的API,允许开发者快速构建搜索应用程序。下面将对Lucene的实例代码和结构流程进行详细...
**Lucene实例项目及其打包文件详解** Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。这个实例项目是基于Lucene官网提供的,旨在帮助开发者更好地理解和使用Lucene进行...
在这个"一个关于lucene实例"的压缩包中,很可能是为了帮助初学者理解并掌握Lucene的基本用法和核心概念。 Lucene的主要功能包括文档的索引和搜索。在索引过程中,它能够分析文本,将文本分词,然后将这些词语转换为...
CreateLucene.java 增量生成索引 CreateLuceneAll.java 全量生成索引 CreateLuceneInter.java 按照时间区间生成索引 里面为参考代码,使用lucene-core-2.9.0.jar
**Lucene 实例使用步骤** 1. **创建索引**:首先,你需要创建一个索引 writer,指定索引目录,然后遍历要索引的文件或数据,使用 Document 对象添加字段,并通过 writer 将其写入索引。 2. **配置分析器**:根据...
在这个"自己写的lucene实例 java搜索引擎"中,我们将会探讨Lucene如何与Java结合,以实现在文件内容中的高效搜索。 首先,我们需要理解Lucene的基本工作流程。这个过程主要包括以下几个步骤: 1. **创建索引**:这...
**Lucene 搜索实例** Apache Lucene 是一个高性能、全文本搜索引擎库,它为开发者提供了在各种应用程序中实现全文检索的工具集。Lucene 并不是一个完整的应用,而是一个 Java 类库,可以被其他 Java 应用程序所使用...
在搜索应用中,Spring可以帮助管理Lucene实例,以及与数据库交互的iBatis配置。 7. **Struts2**:作为MVC框架,Struts2处理HTTP请求,并与后端服务(如Spring和Lucene)交互。用户在前端输入查询后,Struts2会接收...
**Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...