Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.它提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是很受欢迎的免费Java资讯检索程式库。因公司需要,所以开始爬资料学习,希望得到更多大神的指点.然后把这块做好!

当前版本为4.2, 官方网站: http://lucene.apache.org/

在全文索引工具中,都是由3部分组成

1.索引部分

2.分词部分

3.搜索部分

建立索引的步骤

1.创建Directory

2.创建IndexWriter

3.创建Document对象

4.为Document添加Field

/*** Description: 建立索引**/
public void createIndex(){IndexWriter indexWriter = null;try {//1.创建DirectoryDirectory directory = new RAMDirectory();  //在内存中建立索引//2.创建IndexWriterIndexWriterConfig indexWiterConfig = new IndexWriterConfig(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36));indexWriter = new IndexWriter(directory, indexWiterConfig);//3.创建Document对象Document document = new Document();//4.为Document添加FieldFile filePath = new File("luence/example");for(File file: filePath.listFiles()){ //为该文件夹下的所有文件建立索引document = new Document();//传入文件内容document.add(new Field("content",new FileReader(file)));//传入文件名document.add(new Field("filename", file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED));//传入文件路径document.add(new Field("path",file.getAbsolutePath(),Field.Store.YES,Field.Index.NOT_ANALYZED));//5.通过IndexWriter添加文档到索引中indexWriter.addDocument(document);}} catch (Exception e) {e.printStackTrace();}finally{if(indexWriter!=null){try {indexWriter.close();} catch (Exception e) {e.printStackTrace();}}}}

上面实例中在内存中创建索引.也可以在硬盘上创建索引:

Directory directory2 = FSDirectory.open(new File("F:/luence/index"));    //在硬盘上的F:/luence/index下建立索引

搜索操作的步骤:

1.创建Directory

2.创建IndexReader

3.根据IndexReader创建IndexSearcher

4.创建搜索的Query

5.根据Searcher搜索并且返回TopDocs

6.根据TopDocs获取ScoreDoc对象

7.根据Seacher和ScoreDoc对象获取具体的Document对象

8.根据Document对象获取需要的值

9.关闭IndexReader

public  void searcher(){try {//1.创建Directory 在硬盘上的F:/luence/index下建立索引Directory directory = FSDirectory.open(new File("F:/luence/index"));    //2.创建IndexReaderIndexReader indexReader = IndexReader.open(directory);//3.根据IndexReader创建IndexSearcherIndexSearcher indexSearcher = new IndexSearcher(indexReader);//4.创建搜索的Query //创建parser来确定要搜索文件的内容,第二个参数表示搜索的域, 实例中为"content",表示在内容中查找QueryParser queryParser = new QueryParser(Version.LUCENE_36,"content",new StandardAnalyzer(Version.LUCENE_36));//创建query,表示搜索域为content中包含Java关键字的文档Query query = queryParser.parse("Java");    //搜索包含关键字Java的信息//5.根据Searcher搜索并且返回TopDocs            //查询,第二个参数表示显示前10条记录TopDocs topDoc = indexSearcher.search(query, 10);//6.根据TopDocs获取ScoreDoc对象ScoreDoc[] scoreDocs = topDoc.scoreDocs;for(ScoreDoc scoreDoc : scoreDocs){//7.根据Seacher和ScoreDoc对象获取具体的Document对象Document document = indexSearcher.doc(scoreDoc.doc);//8.根据Document对象获取需要的值System.out.println(document.get("filename") + "[" + document.get("path") + "]");}//9.关闭IndexReaderindexReader.close();} catch (Exception e) {// TODO: handle exception}
}

文档Document和域Field的关系

文档Document相当于关系表中的每一条记录,域相当于表中的每一个字段,先创建文档,之后为文档添加域.

域存储选项和域索引选项,均需要在域添加的时候设置

存储域选项

Field.Store.YES表示把这个域中的内容完全存储到文件中,方便进行文本的还原

Field.Store.NO表示把这个域中的内容不存储到文件中,但是可以被索引,此时内容无法还原(即无法document.get());

索引域选项

Field.Index.ANALYZED:进行分词和索引,适用于标题和内容等

Field.Index.NOT_ANALYZED:进行索引,但是不进行分词,像身份证号,姓名,ID等,适用于精确索索

Field.Index.ANALYZED_NO_NORMS:进行分词但是不存储norms信息,这个norms中包括了创建索引的时间和权值等信息

Field.Index.NOT_ANALYZED_NO_NORMS:即不进行分词也不存储norms信息

Field.Index.NO:不进行索引

最佳实践

Field.Index.NOT_ANALYZED_NO_NORMS, Field.Store.YES标识符(主键,文件名),电话号码,身份证号,姓名,日期

Field.Index.ANALYZED, Field.Store.YES文档标题和摘要

Field.Index.ANALYZED, Field.Store.NO文档正文

Field.Index.NO,Field.Store.YES文档类型,数据库主键(不进行索引)

Field.Index.NOT_ANALYZED,Field.Store.NO 隐藏关键字

删除文档操作

public void delete(){IndexWriter indexWriter = null;try {IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,new StandardAnalyzer(Version.LUCENE_36));indexWriter = new IndexWriter(directory, indexWriterConfig);//参数是一个选项,可以是一个Query,也可以是一个Term,Term是一个精确查找的值//此时删除的文档并不会完全被删除,而是存储在一个回收站中,可以恢复//使用Reader可以有效的恢复取到的文档数indexWriter.deleteDocuments(new Term("id","1"));} catch (Exception e) {e.printStackTrace();}finally{if(indexWriter!=null){try {indexWriter.close();} catch (Exception e) {e.printStackTrace();}}}}

indexWriter.deleteDocuments()文档并不会完全被删除,而是存储在一个回收站中,我们可以编写查询类来进行查询

public void query(){try {IndexReader indexReader = IndexReader.open(directory);System.out.println("存储的文档数:" + indexReader.numDocs());System.out.println("总存储量:" + indexReader.maxDoc());System.out.println("被删除的文档:" + indexReader.numDeletedDocs());} catch (Exception e) {e.printStackTrace();}}

测试程序

        LuenceIndex luence = new LuenceIndex("F:/luence/index");luence.index();System.out.println("===== 首次建立索引后进行查询 =====");luence.query();luence.delete();System.out.println("===== 调用删除操作后进行查询 =====");luence.query();

分析程序运行结果

===== 首次建立索引后进行查询 =====
存储的文档数:5
总存储量:5
被删除的文档:0
===== 调用删除操作后进行查询 =====
存储的文档数:4
总存储量:5
被删除的文档:1

使用IndexReader可以有效的恢复删除到回收站的文档

public void recovery(){try {IndexReader indexReader = IndexReader.open(directory,false);//通过IndexReader进行恢复,恢复时,必须把IndexReader的只读(readOnly)设置为falseindexReader.undeleteAll();indexReader.close();} catch (Exception e) {e.printStackTrace();}}

如果要清空回收站中的内容,需要使用IndexWriter中的forceMergeDeletes()方法

public void forceDelete(){IndexWriter indexWriter = null;try {IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,new StandardAnalyzer(Version.LUCENE_36));indexWriter = new IndexWriter(directory, indexWriterConfig);indexWriter.forceMergeDeletes();} catch (Exception e) {e.printStackTrace();}finally{if(indexWriter!=null){try {indexWriter.close();} catch (Exception e2) {e2.printStackTrace();}}}
}

这次测试

public static void main(String[] args) {LuenceIndex luence = new LuenceIndex("F:/luence/index");luence.index();System.out.println("===== 首次建立索引后进行查询 =====");luence.query();luence.delete();System.out.println("===== 调用删除操作后进行查询 =====");luence.query();luence.forceDelete();System.out.println("===== 清空回收站内容后进行查询 =====");luence.query();
}

运行结果

===== 首次建立索引后进行查询 =====
存储的文档数:5
总存储量:5
被删除的文档:0
===== 调用删除操作后进行查询 =====
存储的文档数:4
总存储量:5
被删除的文档:1
===== 清空回收站内容后进行查询 =====
存储的文档数:4
总存储量:4
被删除的文档:0

Luence更新操作

public void update(){IndexWriter indexWriter = null;try {IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,new StandardAnalyzer(Version.LUCENE_36));indexWriter = new IndexWriter(directory, indexWriterConfig);//Luence并没有提供更新,这里的更新操作其实是先删除再添加的操作合集Document document = new Document();document.add(new Field("id","updateId",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));document.add(new Field("email","updateEmail",Field.Store.YES,Field.Index.NOT_ANALYZED));document.add(new Field("content","updateContent",Field.Store.NO,Field.Index.ANALYZED));document.add(new Field("name","updateName",Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));//更新Id为2的数据indexWriter.updateDocument(new Term("id","2"), document);} catch (Exception e) {e.printStackTrace();}finally{if(indexWriter!=null){try {indexWriter.close();} catch (Exception e) {e.printStackTrace();}}}
}

转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/04/06/3002863.html]

转载于:https://www.cnblogs.com/qlong8807/archive/2013/04/07/3003489.html

Luence初始与简单应用-Document的增删改查.相关推荐

  1. MongoDBC++开发(四)bsoncxx::builder::stream::document的增删改查操作

    2. mongocxx 续上一篇,接着看一下mongocxx中的文件有些什么. 先看一下基本的增删改查操作: 2.1 connect.cpp 数据库的链接 参见之前的博客. 2.2 create.cp ...

  2. 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程)

    最近也是临近期末了,各种的期末大作业,后台管理也是很多地方需要用到的,为了方便大家能快速上手,快速搭建一个简单的后台管理,我花了两天时间整理了一下 我会从0开始介绍,从数据库的设计到前端页面的引入最后 ...

  3. ASP.NET操作简单的xml,增删改查

    温习一下对xml的简单操作,贴出来收藏 xml文件格式: <?xml version="1.0" encoding="utf-8"?> <st ...

  4. springboot整合mybatis实现简单的单表增删改查(完整代码可下载)

    搭建项目 项目简单效果,前端效果丑的一批,主要是后端功能实现: springboot增删改查 csdn完整代码下载链接: springboot+mybatis Gitee下载地址: Gitee下载地址 ...

  5. JDBC中用控制台简单对数据库进行增删改查操作(IDEA.2023)

    文章目录 前言 一.首先是每个操作共用的操作大纲 1.注册驱动 2.创建连接 3.编写SQL语句结果,动态值的部分使用?代替 4.创建prepareStatement,并且传入SQL语句的结果 5.占 ...

  6. MVC的简单项目 客户信息-增删改查 崔希凡JavaWeb 之 day-19

    目录 增删改查 以"增"举例 查询 改 查询与修改总结 删除 高级搜索 增删改查 以"增"举例 Servlet的功能:(MVC中的C,控制层,一般包名servl ...

  7. python增删改查的框架_简单的Django框架增删改查操作

    Django之orm对MysqL数据库的增删改查操作简介: 利用Django中orm来查找数据库中的数据,对数据库进行增.删.改.查: 增:新增数据 # 操作数据库user表新增记录 # 方式1: u ...

  8. 使用Django开发简单接口:文章增删改查

    目录 1.一些准备工作 安装django 创建django项目 创建博客应用(app) 2.models.py 3.django admin 登录 创建超级用户 4.修改urls.py 5.新增文章接 ...

  9. 用spring.data的API,ElasticsearchRestTemplate来简单操作Elasticsearch的增删改查等功能~

    写本文的目的就是分享一下我自己常用的基本方法使用,也方便我自己以后来看看~ 参考了spring官方关于ES的文档,和bilibili上的视频~! 截至今日2022/8/5,spring官方更新到 Sp ...

最新文章

  1. 计算一下你的“手指率”
  2. 1月11日学习内容整理:请求库selenium之选择器,等待元素被加载
  3. MyEclipse for Mac快捷键
  4. Github Actions:再次改变软件开发
  5. 2018数学建模国赛总结(A题/编程选手视角)
  6. hadoop之BlockPoolManager源码分析
  7. JDK集合框架结构分析(二)
  8. c++ 深度拷贝和浅度拷贝
  9. 亚马逊选品调研之全球品牌和专利注册查询方法
  10. 学计算机程序ui设计,学习UI设计需要什么样的电脑配置
  11. 三大强者效应:鲶鱼效应,鳄鱼效应,鲦鱼效应
  12. ubuntu内核升级导致显卡驱动丢失
  13. abbyyfinereader软件下载中文注册免安装激活版
  14. python中让输出不换行
  15. 少儿编程scratch与机器人
  16. Kafka 开启 ACLs 权限控制
  17. MPU-6050陀螺仪灵敏度LSBs/°/sec含义并与GY-85对比
  18. oc对mysql支持_iOS中数据库使用什么技术实现的
  19. 字典树(Trie树)两种实现方式详解
  20. astra pro相机(乐视/奥比中光相机)在JETSON NANO、TX2、NX上的ubuntu18.04+ros环境中的驱动及使用

热门文章

  1. 你连原理都还没弄明白?java的基本单位
  2. 使用Pytorch从零搭建高精准度实时目标检测框架
  3. python【蓝桥杯vip练习题库】ALGO-157 阶乘末尾(高精度)
  4. linux i2c调试命令,嵌入式Linux下I2C接口调试
  5. 宁波网络推广浅析网站在优化关键词需注意哪些事项?
  6. 全球缺芯+瑞萨火灾——网络营销之下一众车企减产的减产,停产的停产
  7. 网站栏目该如何做SEO优化?
  8. html5网页代码模板简单,简洁蓝色风格HTML5网页模板
  9. python多态的三种表现形式_python小结----面向对象的三大特征(封装,继承,多态)
  10. vim 双剑合璧,天下无敌(笔记)