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

Lucene 全文检索

阅读更多
1,信息检索与数据库的搜索对比 -- DB就不是为全文检索而设计的
a> 数据库的搜索不能实现我们的全文检索的要求,原因如下:  匹配效果:如搜索 ant,在 sql 中使用 like %ant%'是会搜索出 planting 的,但他不应出现.
b> 查出的结果没有相关度排序,不知道有用的结果在哪一页.
c> 搜索速度太慢,达不到毫秒级的要求

2, 整体流程






3, 主要概念
索引, 分词器, 高亮器, 过滤器

4, 代码
package cn.itcast.lucene.helloworld;

import jeasy.analysis.MMAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
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 cn.itcast.lucene.utils.File2DocumentUtils;

public class HelloWorld2 {

	String filePath = "luceneDatasource\\ch1.txt";
	String filePath2 = "luceneDatasource\\ch2.txt";
	String filePath3 = "luceneDatasource\\ch3.txt";
	String filePath4 = "luceneDatasource\\ch4.txt";
	
	String indexPath = "luceneIndex2";

	Analyzer analyzer = new MMAnalyzer();

	/**
	 * 创建索引
	 * 
	 * IndexWriter 是用来操作(增、删、改)索引库的
	 */
	@Test
	public void createIndex() throws Exception {
		// file --> doc
		Document doc = File2DocumentUtils.file2Document(filePath);
		Document doc2 = File2DocumentUtils.file2Document(filePath2);
		Document doc3 = File2DocumentUtils.file2Document(filePath3);
		Document doc4 = File2DocumentUtils.file2Document(filePath4);
		
		// 建立索引
		IndexWriter indexWriter = new IndexWriter(indexPath, analyzer, true,
				MaxFieldLength.LIMITED);
		indexWriter.addDocument(doc);
		indexWriter.addDocument(doc2);
		indexWriter.addDocument(doc3);
		indexWriter.addDocument(doc4);
		
		indexWriter.close();
	}

	/**
	 * 搜索
	 * 
	 * IndexSearcher 是用来在索引库中进行查询的
	 */
	@Test
	public void search() throws Exception {
//		String queryString = "document";
		String queryString = "商品";

		// 1,把要搜索的文本解析为 Query
		String[] fields = { "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 + "】条匹配结果");

		// 3,打印结果
		for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
			int docSn = scoreDoc.doc; // 文档内部编号
			Document doc = indexSearcher.doc(docSn); // 根据编号取出相应的文档
			File2DocumentUtils.printDocumentInfo(doc); // 打印出文档信息
		}
	}
}

package cn.itcast.lucene.utils;

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;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;

public class File2DocumentUtils {

	// 文件:name, content, size, path
	public static Document file2Document(String path) {
		File file = new File(path);

		Document doc = new Document();
		doc.add(new Field("name", file.getName(), Store.YES, Index.ANALYZED));
		doc.add(new Field("content", readFileContent(file), Store.YES, Index.ANALYZED));
		doc.add(new Field("size", NumberTools.longToString(file.length()), Store.YES, Index.NOT_ANALYZED));
		doc.add(new Field("path", file.getAbsolutePath(), Store.YES, Index.NOT_ANALYZED));
		return doc;
	}

	// public static void document2File(Document doc ){
	//		
	// }

	/**
	 * 读取文件内容
	 */
	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;) {
				content.append(line).append("\n");
			}

			return content.toString();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * <pre>
	 * 获取 name 属性的值的两种方法:
	 * 1,Field f = doc.getField(&quot;name&quot;);
	 *    f.stringValue();
	 * 2,doc.get(&quot;name&quot;);
	 * </pre>
	 * 
	 * @param doc
	 */
	public static void printDocumentInfo(Document doc) {
		// Field f = doc.getField("name");
		// f.stringValue();
		System.out.println("------------------------------");
		System.out.println("name     = " + doc.get("name"));
		System.out.println("content  = " + doc.get("content"));
		System.out.println("size     = " + NumberTools.stringToLong(doc.get("size")));
		System.out.println("path     = " + doc.get("path"));
	}

}



5, 相关查询文件 & JAR包
见附件
  • 大小: 24.2 KB
  • 大小: 79.3 KB
  • lib.rar (1.8 MB)
  • 下载次数: 11
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    lucene全文检索需要jar包

    **Lucene 全文检索与所需Jar包详解** Lucene 是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高效、可扩展的搜索功能,使得开发者能够在其应用程序中轻松实现复杂的全文检索。在使用Lucene进行全文...

    Lucene全文检索引擎

    **Lucene全文检索引擎** Lucene是Apache软件基金会的一个开源项目,它是一个高性能、全文本搜索引擎库,可以被集成到各种应用中实现全文检索功能。Lucene提供了完整的搜索功能实现,包括索引创建、文档存储、查询...

    lucene 全文检索

    **Lucene 全文检索详解** Lucene 是一个开源的全文检索库,由Apache软件基金会维护,它提供了高效的全文检索和分析功能。Lucene 广泛应用于网站搜索、文档检索、信息提取等领域,是Java开发人员实现全文搜索引擎的...

    超系统学习Lucene全文检索技术视频教程

    视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 目前业界流行的ElasticSearch和Solr搜索...系统的学习Lucene全文检索技术,全面掌握搜索原理和底层知识,为学习其他应用层面搜索技术打下坚实的基础。

    lucene全文检索全面教程

    **Lucene全文检索全面教程** Lucene是一款由Apache软件基金会开发的开源全文检索库,它为开发者提供了在Java应用程序中实现高性能、可扩展的全文检索功能。本教程将深入探讨Lucene的核心概念、架构和使用方法,帮助...

    使用lucene全文检索数据库

    **使用Lucene全文检索数据库** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它是Java编写的,能够帮助开发者在各种应用程序中实现强大的全文检索功能。在这个项目中,我们将探讨如何利用Lucene ...

    lucene全文检索

    lucene全文检索,适用于ppt,word,pdf,excel等

    lucene全文检索引擎资料包(有项目)

    资料包中的"lucene全文检索引擎"可能包含示例代码、教程或者实际的项目案例,这可以帮助你理解如何在实际应用中使用Lucene。你可以通过这些资源学习: - 如何创建和管理索引。 - 如何编写查询解析器和定制查询行为...

    lucene全文检索word2007

    **Lucene全文检索Word2007** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高效、可扩展的搜索框架,使得开发者能够在其应用程序中集成高级的搜索功能。在本示例中,我们讨论的是...

    lucene全文检索案例源码

    《深入剖析Lucene全文检索案例源码》 在信息技术领域,全文检索技术是搜索引擎的核心,而Lucene作为Java平台上的一个开源全文检索库,被广泛应用于各种搜索应用中。本篇将围绕“lucene全文检索案例源码”展开,深入...

    lucene全文检索教程

    **Lucene全文检索教程** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个教程,"Lucene In Action, 2nd Edition MEAP"(预先发行版),提供了一个深入理解如何利用Lucene进行全文检索的宝贵...

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

    《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...

    Lucene全文检索案例

    **Lucene 全文检索案例** Lucene 是一个高性能、可扩展的信息检索库,由Apache软件基金会开发。它提供了一个简单但功能强大的API,用于在各种数据源中实现全文搜索。这个案例将深入探讨如何使用Lucene进行全文检索...

    SpringMvc+Lucene全文检索

    **Spring MVC + Lucene 全文检索** 在现代Web应用中,实现高效的全文检索功能是提升用户体验的关键之一。本文将详细介绍如何使用Spring MVC框架结合Apache Lucene库来构建一个强大的全文检索系统。首先,让我们了解...

    lucene全文检索资源包

    **Lucene 全文检索资源包详解** Lucene 是一个由 Apache 软件基金会开发的开源全文检索库,主要用于构建高效、可扩展的信息检索应用。这个“lucene全文检索资源包”包含了 Lucene 的一个早期版本——1.4.3,虽然...

    Lucene全文检索框架+Solr搜索引擎(2018版.Java)

    **Lucene全文检索框架** Lucene是一个开源的Java全文检索库,由Apache软件基金会开发。它提供了文本分析、索引创建、文档检索等核心功能,是构建高效、可扩展搜索应用的基础。Lucene的主要特点包括: 1. **高速...

    Lucene全文检索引擎简介

    建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一...从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。

Global site tag (gtag.js) - Google Analytics