`

Lucene实例

阅读更多

建立索引:

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 全文搜索引擎实例:Java Lucene 实例** Lucene 是 Apache 软件基金会的一个开源项目,它提供了一个高性能、可扩展的信息检索库。这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索...

    lucene实例

    这个"lucene实例"的压缩包文件很可能是为了演示或教学如何使用Lucene进行文本检索和分析。Lucene的核心功能包括文档索引、搜索、排序以及相关性评分等,它被广泛应用于各种信息检索系统中,如网站搜索、企业内部信息...

    Java搜索工具——Lucene实例总结(一)

    Java搜索工具——Lucene实例总结(一) 在Java开发中,搜索引擎已经成为不可或缺的一部分,而Apache Lucene正是一个强大的全文搜索引擎库。这篇博文将带你深入理解Lucene的基本概念和使用方式,帮助你快速入门并掌握...

    lucene实例(包括分页、中文检索等)

    lucene实例是一个比较详细的例子,包括lucene的入门到高级实例,代码里有比较详细的实例,所有的实例都是通过junit来测试的。实例包括各种搜索:如通配符查询、模糊查询、查询结果的分页、中文分词器、自定义分词器...

    经典的lucene实例代码及详细解析以及lucene结构流程介绍

    经典的Lucene实例代码及详细解析以及Lucene结构流程介绍 Lucene是一个功能强大且灵活的开源搜索引擎库,它提供了一个简单易用的API,允许开发者快速构建搜索应用程序。下面将对Lucene的实例代码和结构流程进行详细...

    lucene实例项目及其打包文件

    **Lucene实例项目及其打包文件详解** Lucene是一款强大的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。这个实例项目是基于Lucene官网提供的,旨在帮助开发者更好地理解和使用Lucene进行...

    一个关于lucene实例

    在这个"一个关于lucene实例"的压缩包中,很可能是为了帮助初学者理解并掌握Lucene的基本用法和核心概念。 Lucene的主要功能包括文档的索引和搜索。在索引过程中,它能够分析文本,将文本分词,然后将这些词语转换为...

    LUCENE实例

    CreateLucene.java 增量生成索引 CreateLuceneAll.java 全量生成索引 CreateLuceneInter.java 按照时间区间生成索引 里面为参考代码,使用lucene-core-2.9.0.jar

    Lucene 实例

    **Lucene 实例使用步骤** 1. **创建索引**:首先,你需要创建一个索引 writer,指定索引目录,然后遍历要索引的文件或数据,使用 Document 对象添加字段,并通过 writer 将其写入索引。 2. **配置分析器**:根据...

    自己写的lucene实例 java搜索引擎

    在这个"自己写的lucene实例 java搜索引擎"中,我们将会探讨Lucene如何与Java结合,以实现在文件内容中的高效搜索。 首先,我们需要理解Lucene的基本工作流程。这个过程主要包括以下几个步骤: 1. **创建索引**:这...

    Lucene搜索实例

    **Lucene 搜索实例** Apache Lucene 是一个高性能、全文本搜索引擎库,它为开发者提供了在各种应用程序中实现全文检索的工具集。Lucene 并不是一个完整的应用,而是一个 Java 类库,可以被其他 Java 应用程序所使用...

    lucene的小案例

    在搜索应用中,Spring可以帮助管理Lucene实例,以及与数据库交互的iBatis配置。 7. **Struts2**:作为MVC框架,Struts2处理HTTP请求,并与后端服务(如Spring和Lucene)交互。用户在前端输入查询后,Struts2会接收...

    Lucene索引器实例

    **Lucene索引器实例详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文...

Global site tag (gtag.js) - Google Analytics