`
ln_ydc
  • 浏览: 271264 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

lucene全文检索入门实例

 
阅读更多

基本概念:




前期准备:

 

lucene-2.4.0

junit4.9

 

实例代码:

 

package com.ln.ydc.lucene.test;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
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.junit.Test;

import com.ln.ydc.lucene.util.LuceneUtil;

/**
 * 1.根据 数据源文件 创建索引库 
 * 2.根据 数据源文件所在的目录 创建索引库 
 * 3.根据索引搜索关键字
 * 
 * @author ydc
 * 
 */
public class HelloWorld {
	// 数据源文件路径
	String filePath = "D:\\logs\\lucene\\datasource\\eng_article.txt";
	// 索引库目录
	String indexPath = "D:\\logs\\lucene\\luceneIndex";
	// Directory directory = Directory.createOutput(indexPath);
	// 数据源目录
	String dirPath = "D:\\logs\\lucene\\datasource";

	// 词库分词器
	Analyzer analyzer = new StandardAnalyzer();
	// Analyzer analyzer = new MMAnalyzer();	// 中文分词器

	/**
	 * 根据数据源文件创建索引库
	 * 
	 * IndexWriter 是用来操作索引库的(增、删、改)
	 */
	@Test
	public void createIndexByFile() throws Exception {
		Document doc = LuceneUtil.file2Document(filePath);
		// file-->doc

		IndexWriter indexWriter = new IndexWriter(indexPath, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
		indexWriter.addDocument(doc);
		// optimize()方法是对索引进行优化
		indexWriter.optimize();
		indexWriter.close();
	}

	/**
	 * 根据数据源文件目录创建索引库
	 * 
	 * @throws Exception
	 */
	@Test
	public void createIndexByDir() throws Exception {
		File filesDir = new File(dirPath);
		IndexWriter indexWriter = new IndexWriter(indexPath, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
		for (String filePath : filesDir.list()) {
			Document doc = LuceneUtil.file2Document(dirPath + "//" + filePath);
			indexWriter.addDocument(doc);
		}
		// optimize()方法是对索引进行优化
		indexWriter.optimize();
		indexWriter.close();
	}

	/**
	 * 搜索
	 * 
	 * @throws ParseException
	 * @throws IOException
	 */
	@Test
	public void search() throws ParseException, IOException {
		String queryString = "村上春树";

		// 1.把要搜索的文本解析为Query
		String[] fields = { "name", "content" };
		QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
		Query query = queryParser.parse(queryString);

		// 2.进行查询
		IndexSearcher indexSearcher = new IndexSearcher(indexPath);
		Filter filter = null;
		TopDocs topDocs = indexSearcher.search(query, filter, 10000);

		// 打印结果
		System.out.println("总共有【" + topDocs.totalHits + "】条匹配结果");
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int docSn = scoreDoc.doc; // 文档内部编号
			Document doc = indexSearcher.doc(docSn); // 根据编号取出相应的文档
			LuceneUtil.printDocumentInfo(doc); // 打印出文档信息
		}
	}
}

 

package com.ln.ydc.lucene.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumberTools;

public class LuceneUtil {

	/**
	 * 将一个具体的文件转换成document 
	 * 保存文件的如下信息:
	 * name 	文件名 
	 * content 	文件内容
	 * size 	文件大小 
	 * path		文件路径
	 * 
	 * @param filePath
	 * @return
	 */
	public static Document file2Document(String filePath) {
		File file = new File(filePath);
		Document doc = new Document();
		doc.add(new Field("name", file.getName().trim(), Field.Store.YES, Field.Index.ANALYZED));
		doc.add(new Field("content", readFileContent(file), Field.Store.YES, Field.Index.ANALYZED));
		doc.add(new Field("size", NumberTools.longToString(file.length()), Field.Store.YES, Field.Index.ANALYZED));
		doc.add(new Field("path", file.getAbsolutePath(), Field.Store.YES, Field.Index.NO));
		return doc;
	}

	/**
	 * 读取文件内容
	 * 
	 * @param file
	 * @return
	 */
	public static String readFileContent(File file) {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
			StringBuffer content = new StringBuffer();
			for (String line = null; (line = reader.readLine()) != null;) {
				if(line!=null && !"".equals(line=line.trim()))
					content.append(line).append("\n");
			}
			return content.toString();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * <pre>
	 * 获取 name 属性的值的两种方法:
	 * 1.Field field = doc.getField(&quot;name&quot;);
	 *  field.stringValue();
	 *  该方法已过时
	 * 2.doc.get(&quot;name&quot;);
	 * </pre>
	 * 
	 * @param doc
	 */
	public static void printDocumentInfo(Document doc) {
		System.out.println("--------------------------------------------");
		System.out.println("【name】 \t " + doc.get("name"));
		System.out.println("【content】 \t " + doc.get("content"));
		System.out.println("【size】 \t " + doc.get("size"));
		System.out.println("【path】 \t " + doc.get("path"));
	}
	/*
	public static void printDocumentInfo(QueryResult<Document> qr) {
		System.out.println("总共有【" + qr.getRecordCount() + "】条匹配结果");
		for(Document doc : qr.getRecordList()) {
			printDocumentInfo(doc);
		}
	}
*/
 }
  • 大小: 8.2 KB
分享到:
评论

相关推荐

    lucene3.0全文检索入门实例

    **Lucene 3.0 全文检索入门实例** Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了一个高级、灵活的搜索功能框架,允许开发者在自己的应用中轻松地集成全文检索功能。本文将重点介绍如何使用 ...

    最新全文检索 lucene-5.2.1 入门经典实例

    《最新全文检索 Lucene-5.2.1 入门经典实例》 Lucene是一个开源的全文检索库,由Apache软件基金会开发,广泛应用于各种信息检索系统。在5.2.1版本中,Lucene提供了更为高效和强大的搜索功能,为开发者提供了构建...

    全文检索 lucene-5.2.1 入门Eclipse工程实例

    Eclipse工程文件,全文检索 lucene-5.2.1 入门Eclipse工程实例,福利放送,与lucene3结果比对

    Lucene索引搜索简介以及入门实例源码.rar

    这个压缩包中的内容可能是关于如何使用Lucene进行全文检索的一个基础教程和示例代码。 **一、Lucene的基本概念** 1. **文档(Document)**:在Lucene中,每个要被搜索的信息被看作一个文档,可以包含多个字段...

    Lucene 4.8全文检索引擎入门示例文档

    《Lucene 4.8 全文检索引擎入门详解》 Lucene 是一款开源的全文检索库,由 Apache 软件基金会维护。在版本 4.8 中,Lucene 提供了强大的文本分析、索引构建和搜索功能,使得开发者能够轻松地在应用程序中集成高效的...

    lucene3.6入门实例教程

    《Lucene 3.6 入门实例教程》是一份专...总之,《Lucene 3.6 入门实例教程》是学习Lucene的理想资源,它将理论知识与实践操作紧密结合,使开发者能够快速掌握全文检索技术,为构建高效、精准的搜索应用打下坚实的基础。

    Lucene 的入门 实例 代码

    Lucene 是一个由Apache软件基金会开发的开源全文检索引擎工具包,它并非一个完整的搜索引擎,而是提供了一个强大的架构,允许开发人员轻松地在他们的应用程序中集成全文检索功能。Lucene 支持多种语言,包括英文和...

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

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

    Lucene3.0入门实例含jar包

    **Lucene 3.0 入门实例及关键知识点** ...总之,Lucene 3.0 入门实例提供了理解全文搜索引擎工作原理的基础,通过实践,开发者能够熟练掌握如何在自己的应用程序中集成和利用 Lucene 实现高效、精准的文本搜索功能。

    Apache Lucene3.0 入门实例介绍

    这个入门实例将引导我们了解如何使用Lucene 3.0版本进行基本的索引和搜索操作。以下是对Lucene 3.0关键知识点的详细讲解: 1. **Lucene的架构**: Lucene的核心组件包括文档(Document)、字段(Field)、索引...

    lucene.net+完全入门教程

    10. **应用实例**: Lucene.Net常用于网站的搜索功能、大数据分析、日志分析、电子邮件搜索以及任何需要快速全文检索的场合。 通过学习这个“lucene.net+完全入门教程”,开发者可以了解如何在.NET环境中设置Lucene...

    搜索引擎 Lucene PPT 教程

    3. 书籍:《Lucene in Action》是一本经典的Lucene入门书籍,深入浅出地讲解了Lucene的各个方面。 通过这个PPT教程,你将全面了解Lucene的原理、使用方法以及如何在实际项目中集成和优化搜索引擎。每个章节都会结合...

    最新全文检索系统开源lucene资料大全(pdf格式)

    "最新全文检索系统开源lucene资料大全"这个资料包很可能包含了Lucene的使用教程、API参考、实战案例等内容,帮助初学者快速入门并掌握Lucene的核心概念和技术。通过阅读PDF文档,你可以了解如何安装、配置、索引文档...

    Lucene 3.0完成入门

    Lucene 是一个开源的全文检索库,由 Apache 软件基金会维护。它为开发者提供了一种高级的文本搜索功能,允许他们在应用程序中集成强大的搜索引擎。本篇文章将围绕 Lucene 3.0 版本,详细介绍其入门知识,并通过提供...

    lucene 入门

    Lucene 提供了强大的文本分析、索引和查询功能,使开发者能够快速实现复杂的全文检索功能。 **Lucene 核心组件** Lucene 的核心组件包括以下几个部分: 1. **索引(Indexing)**:Lucene 首先将非结构化的文本...

    第一个Lucene 3.6 (3.X) 入门实例

    【标题】:“第一个Lucene 3.6 (3.X) 入门实例” 【内容详解】 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它为Java开发者提供了强大的文本检索功能,广泛应用于搜索引擎、信息检索系统等场景。...

    lucene入门实例

    **Lucene 入门实例详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够快速地在大量文本数据中实现全文检索功能。这个入门实例将帮助我们...

    全文搜索引擎lucene入门

    **全文搜索引擎Lucene入门** 全文搜索引擎Lucene是Apache软件基金会的一个开放源代码项目,它为Java开发者提供了一个高性能、可扩展的信息检索库。Lucene以其强大的文本搜索功能和高效的索引能力,在各种需要全文...

Global site tag (gtag.js) - Google Analytics