热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[JavaWeb]Java的全文搜索类库Lucene

Lucene是apache软件基金会4jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。


Lucene的实现机制是倒排表。例如现在有2个文档需要建立索引,内容分别为"Lucene Learning"和"Lucene Hadoop",建立后的索引实际是这样的:

索引的优势在于:虽然建立索引会比较耗时,但是在一次建立后便可以永远支持高效的查询。


Lucene的核心类有:

Directory:索引对象,常用有RAMDirectory和FSDirectory两种,前者代表一个内存中的索引文件,后者代表一个本地的索引文件。

Filed:字段,由name和value组成,常用的字段分为三种:

  1. StoredFiled:仅用来存储数据的字段,该字段的数据不会建立索引。
  2. StringFiled、LongFiled等:将数据整体建立为索引的字段。
  3. TextFiled:将数据分词并建立索引的字段。

Document:索引中存储的文档结构,一个文档由多个字段组成。

Term:词元,相当于索引中的键,每个Term都指向一个由文档组成的链表。

IndexReader:索引的读取流,可以从索引中读取出需要的文档。

IndexWriter:索引的输出流,将文档写入索引。

IndexSearcher:索引的搜索功能。

Query:搜索条件。

Analyzer:分词器,可以将字段中的数据分解成多个词元。


Lucene的流程:


写入:将数据源转换为文档,然后使用IndexWriter的addDocument方法将文档添加到索引。

查询:使用IndexReader获取一个IndexSearcher对象,并创建一个Query对象指定查询类型,然后使用IndexSearcher的search方法得到文档。


代码实例:

添加索引:

public static void init() throws IOException {
	//索引文件
	Directory dir = FSDirectory.open(new File("E:/index"));
	//索引配置(指定Lucene版本和分词器)
	IndexWriterConfig cOnfig= new IndexWriterConfig(Version.LUCENE_4_10_0, new StandardAnalyzer());
	//得到输出流
	IndexWriter writer = new IndexWriter(dir, config);
	//创建文档
	Document doc = new Document();
	//id会以一个整体被作为词元被索引 并且会被存储在文档中
	doc.add(new StringField("id", "123", Field.Store.YES));
	//content会被分词器分割成数个词元被索引 但不会存储在文档中
	doc.add(new TextField("content", "Lucene是apache软件基金会4 jakarta" +
			"项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎," +
			"而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎," +
			"部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件" +
			"开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的" +
			"功能,或者是以此为基础建立起完整的全文检索引擎。", Field.Store.NO));
	//address会被分词器分割成数个词元被索引 并且会存储在文档中
	doc.add(new TextField("address", "北京市海淀区翠微路凯德大厦", Field.Store.YES));
	//将文档添加到索引
	writer.addDocument(doc);
	//打印当前已经被索引的文档个数
	System.out.println("被索引的文档个数:" + writer.numDocs());
	writer.close();
}

遍历索引中所有的文档:

public static void ergodic() throws IOException {
	//索引文件
	Directory dir = FSDirectory.open(new File("E:/index"));
	//得到输入流
	IndexReader reader = DirectoryReader.open(dir);
	IndexSearcher searcher = new IndexSearcher(reader);
	Document doc = null;
	for (int i = 0; i  
 


搜索文档:

public static void search() throws IOException, ParseException {
	//索引文件
	Directory dir = FSDirectory.open(new File("E:/index.txt"));
	//输入流
	IndexReader reader = DirectoryReader.open(dir);
	IndexSearcher searcher = new IndexSearcher(reader);
	// 搜索条件
	QueryParser parser = new QueryParser("desc",
			new StandardAnalyzer());
	Query query = parser.parse("索引文件");
	// 搜索结果
	TopDocs hits = searcher.search(query, 2);
	System.out.println("查询出来的总数是:" + hits.totalHits);
	// 获取搜索结果
	Document doc = null;
	for (ScoreDoc scoreDoc : hits.scoreDocs) {
		doc = searcher.doc(scoreDoc.doc);
		System.out.println("Doc [" + scoreDoc.doc + "] : id: "
				+ doc.get("id") + ", desc: " + doc.get("content"));
	}
}

一些细节:
  1. 对于一个索引文件,同时只能有一个输出流对它进行操作.
  2. 为了避免频繁的I/O操作,可以先将索引建立在RAMDirectory中,然后一次性写入本地文件。
  3. 中文分词库比较好用的有Ansj和IK,可以自行百度了解。
  4. Lucene不支持去重,DuplicateFilter会先将索引进行去重后在进行条件查询,这样会造成数据缺失。
  5. 索引的更新可以先根据词元删除原本的文档后再添加新的文档,在批量操作时效率很高。



推荐阅读
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
让爱自由2009
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有