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

luncene

一、信息检索和全文检索信息检索就是从信息集合中找出与用户需求相关的信息。被检索的信息除了文本外,还有图像、音频、视频等多媒体信息。我们只关注文本的检索,

一、信息检索和全文检索

信息检索就是从信息集合中找出与用户需求相关的信息。被检索的信息除了文本外,还有图像、音频、视频等多媒体信息。我们只关注文本的检索,把用户的查询请求和全文中的每一个词进行比较,不考虑查询请求与文本语义上的匹配,这叫做全文检索。在信息检索工具中,全文检索是最具通用性和实用性的。例如,使用百度从一大堆网页中搜出与“传智播客”相关的网页。

我们简单看一下检索技术的流程:

请求

clip_image001

上面可见索引数据库是十分重要的,简单的说。全文检索系统,将网络上的数据通过某种格式保存到索引库中。当用户发送查询请求时,实质上就是向索引库查询。全文检索引擎负责处理用户的请求用索引库的更新等。

小时候查的汉语字典、英语词典…我们是如何查询的?当然不是一页一页的翻了,靠的是字典的目录。Lucene的检索方式正是使用了此技术,lucene的索引库格式:

检索目录

数据

索引

关键字

索引

Documents…

1

C、汇编

1

汇编比机器在语言高级…C比汇编高级

2

C++

2

C++比C高级..

3

Java、J2E

3

JAVA应用级,最为优秀的语言

4

WEB

4

WEB是真正的计算机…

5

你好

5

Hi,你好啊!

上面的表只是简单说明lucene索引库的存储格式。我们通过lucene提供的类可以向索引库添加、修改、查询、删除操作…。

关键字是通过分词器分析出来的,一般情况下各有语言有各字的分词器。分词器的强大提高了查询数据的接近性。

二、lucene操作

我们编写一个对Article对象向lucene索引库的添加、修改、查询、删除操作:

import java.util.ArrayList;

import java.util.List;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.index.IndexWriter.MaxFieldLength;

import org.apache.lucene.queryParser.MultiFieldQueryParser;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.search.TopDocs;

import cn.itcast.cc.lucene.helloword.Article;

import cn.itcast.cc.lucene.helloword.utils.ArticleDocUtils;

publicclass IndexDao {

// 索引目录

private String indexPath = "./index";

// 分词器

private Analyzer analyzer = new StandardAnalyzer();

/**

*保存记录

*

*@paramart

*/

publicvoid save(Article art) {

// lucene的写出索引类

IndexWriter indexWriter = null;

try {

indexWriter = new IndexWriter(this.indexPath, this.analyzer,

MaxFieldLength.LIMITED);

// 添加到索引库

indexWriter.addDocument(ArticleDocUtils.Article2Doc(art));

} catch (Exception e) {

e.printStackTrace();

}

// 释放indexWriter

if (indexWriter != null) {

try {

// 使用后一定要关闭

indexWriter.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

*更新记录

*

*@paramart

*/

publicvoid update(Article art) {

IndexWriter indexWriter = null;

try {

indexWriter = new IndexWriter(this.indexPath, this.analyzer,

MaxFieldLength.LIMITED);

Term term = new Term("id", art.getId() + "");

// 更新

indexWriter.updateDocument(term, ArticleDocUtils.Article2Doc(art));

} catch (Exception e) {

e.printStackTrace();

}

// 释放indexWriter

if (indexWriter != null) {

try {

indexWriter.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

*删除记录

*

*@paramid

*/

publicvoid delete(int id) {

IndexWriter indexWriter = null;

try {

indexWriter = new IndexWriter(this.indexPath, this.analyzer,

MaxFieldLength.LIMITED);

Term term = new Term("id", id + "");

// 删除

indexWriter.deleteDocuments(term);

} catch (Exception e1) {

e1.printStackTrace();

}

// 释放indexWriter

if (indexWriter != null) {

try {

indexWriter.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

*查询记录(具有分页功能)

*

*@paramqueryString

*@paramstartIndex

*@paramrecordCount

*@return

*/

public List search(String queryString, int startIndex, int recordCount) {

List result = new ArrayList();

IndexSearcher indexSearcher = null;

try {

indexSearcher = new IndexSearcher(this.indexPath);

String[] fields = new String[] {"title","content"};

// 分析查询条件

QueryParser queryParser = new MultiFieldQueryParser(fields,

this.analyzer);

// 生成查询对象

Query query = queryParser.parse(queryString);

int findTotalRecord = startIndex + recordCount;

// 查询

TopDocs topDocs = indexSearcher.search(query, null, findTotalRecord);

//获取分页数据

int endIndex = Math.min(startIndex+recordCount,topDocs.totalHits);

for(int i=startIndex; i

result.add(indexSearcher.doc(topDocs.scoreDocs[i].doc));

}

} catch (Exception e1) {

e1.printStackTrace();

}

// 释放indexWriter

if (indexSearcher != null) {

try {

indexSearcher.close();

} catch (Exception e) {

e.printStackTrace();

}

}

return result;

}

}

其中使用到的“ArticleDocUtils”如下:

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.document.Field.Index;

import org.apache.lucene.document.Field.Store;

import cn.itcast.cc.lucene.helloword.Article;

publicclass ArticleDocUtils {

publicstatic Document Article2Doc(Article art){

// lucene索引库中的document对象

Document doc = new Document();

// 添加到document中的都是field对象,注册其中的key,检索时会用到。

// Store是否存储,决定对象是临时性还是持久性的

// Index在库中建立什么样的索引

doc.add(new Field("id", art.getId()+"", Store.YES, Index.NOT_ANALYZED));

doc.add(new Field("title", art.getTitle(), Store.YES, Index.ANALYZED));

doc.add(new Field("content", art.getContent(), Store.YES, Index.ANALYZED));

return doc;

}

publicstatic Article Doc2Article(Document doc){

Article art = new Article();

art.setId(Integer.parseInt(doc.getField("id").stringValue()));

art.setTitle(doc.getField("title").stringValue());

art.setContent(doc.getField("content").stringValue());

return art;

}

需要导入的jar包:lucene-analyzers-2.4.0.jar、lucene-core-2.4.0.jar、lucene-highlighter-2.4.0.jar。



推荐阅读
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
author-avatar
手机用户2502887197
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有