/**
* Created by mhm on 2019/6/24.
*/
@RunWith(SpringJUnit4ClassRunner.class)
public class LuceneTest { @Test
public void test1() throws IOException {
/**
* 1.准备数据 文档对象
* Document 封装数据 要创建索引的数据必须先放着Document
*
* id 1
* title 背影
* author 朱自清
* content 你站在这里不要动,我去给你买几个橘子
*
* Field 封装数据 实体类中一个属性数据封装在一个Field对象中
* 八种基本类型 StringField 数据不会做分词处理
* TextField 文本Field 数据会分词
*
* 参数1:name 属性名
* 参数2:value 属性值
* 参数3:Field.Store.YES
*/
Document document = new Document();
document.add(new IntField("id",1, Field.Store.YES));
document.add(new TextField("title","背影",Field.Store.YES));
document.add(new StringField("author","朱自清",Field.Store.YES));
document.add(new TextField("content","你站在这里不要动,我去给你买几个橘子",Field.Store.YES)); /**
* 2.扫描数据 创建索引
*
* IndexWriter 索引写出对象
* 作用
* 1.将索引持久化 实际上就是流
* 2.定义分词规则 分词器(别人封装好的分词规则)
*
* 参数1:Directory 指明索引保存的位置 这个文件夹的位置就是索引库
* 参数2:IndexWriterConfig 索引写出配置对象 定义分词规则
* IndexWriterConfig
* 参数1:Lucene的版本
* 参数2:分词器对象
*/ FSDirectory fsDirectory = FSDirectory.open(new File("E://Lucene"));
/**
* StandardAnalyzer 标准分词器
*/
StandardAnalyzer standardAnalyzer = new StandardAnalyzer(Version.LUCENE_44);
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_44,standardAnalyzer);
IndexWriter indexWriter = new IndexWriter(fsDirectory,indexWriterConfig); /**
* 3.addDocument 把原始数据给写出对象
* indexWriter 会把原始数据写出到索引库 在写出的同时indexWriter会自动的扫描原始数据创建索引
*/
indexWriter.addDocument(document);
/**
* 4.将索引提交到索引库
*/
indexWriter.commit();
/**
* 5.释放资源
*/
indexWriter.close();
}
/**
* 查询
*/
@Test
public void test2() throws ParseException, IOException {
/**
* 1. 准备关键词
*/
String keyword = "你站在这里不要动";
/**
* 2. 处理关键词(拆分) Query对象(封装了拆分好的关键词)
* MultiFieldQueryParser 关键词处理对象 可以将关键词处理为Query对象
* 参数1:版本
* 参数2:属性名的数组(被查询的属性)
* 参数3:分词器对象 拆分词语 必须和创建的索引时候的分词器一致
*
* parse 方法处理关键词
*/
String[] fileds = {"title","content"};
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_44,fileds,new StandardAnalyzer(Version.LUCENE_44));
Query query = queryParser.parse(keyword);
/**
* 3. 用处理好的关键词 查索引
*
* 把索引库读取到JVM里面(内存)
* IndexSearcher 索引查询对象
* 参数1:索引读取对象
*
* DirectoryReader.open() 读取索引库
* 参数1:FSDirectory File System 文件系统 指的就是磁盘
*
*/
FSDirectory directory = FSDirectory.open(new File("E://Lucene"));
DirectoryReader directoryReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(directoryReader);
/**
* 4. 通过查到的索引中的位置信息 获取数据
*
* search()
* 参数1:处理好的关键词
* 参数2:期望结果条数 你想要查到最多多少条信息
*
* 返回值 TopDocs 封装了结果的信息(索引 分数等待)
*
*/
TopDocs topDocs = indexSearcher.search(query, 10);
/**
* ScoreDoc 分数和文档对象的数组
* 封装了分数和Document的docId(Lucene在创建索引的时候自动生成的 就是位置信息)
*
* Lucene在创建索引库的时候,不仅创建了索引,还把原始数据Document对象也放在了索引库中
*/
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
System.out.println(Arrays.toString(scoreDocs));
/**
* 5.通过位置信息docId去索引库中获取原始数据
*/
for (int i = 0; i < scoreDocs.length; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
// 获取docId
int docId = scoreDoc.doc;
// 通过docId获取索引库中对应的Document对象(对象中封装了原始数据)
Document document = indexSearcher.doc(docId);
System.out.println(document);
String id = document.get("id");
String title = document.get("title");
String author = document.get("author");
String content = document.get("content");
System.out.println(id+" "+title+" "+author+" "+content);
}
}
}

LuceneTest的更多相关文章

  1. MVC+MQ+WinServices+Lucene.Net Demo

    前言: 我之前没有接触过Lucene.Net相关的知识,最近在园子里看到很多大神在分享这块的内容,深受启发.秉着“实践出真知”的精神,再结合公司项目的实际情况,有了写一个Demo的想法,算是对自己能力 ...

  2. lucene4.7学习总结

    花了一段时间学习lucene今天有时间把所学的写下来,网上有很多文章但大部分都是2.X和3.X版本的(当前最新版本4.9),希望这篇文章对自己和初学者有所帮助. 学习目录 (1)什么是lucene ( ...

  3. lucene之排序、设置权重、优化、分布式搜索(转)

    lucene之排序.设置权重.优化.分布式搜索(转) 1. 基本应用 using System;using System.Collections.Generic;using System.Text;u ...

  4. lucene创建索引简单示例

    利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...

  5. apache pdfbox

    转 http://www.blogjava.net/sxyx2008/archive/2010/07/23/326890.html 轻松使用apache pdfbox将pdf文件生成图 近期在项目中使 ...

  6. MVC+MQ+WinServices+Lucene.Net

    MVC+MQ+WinServices+Lucene.Net Demo 前言: 我之前没有接触过Lucene.Net相关的知识,最近在园子里看到很多大神在分享这块的内容,深受启发.秉着“实践出真知”的精 ...

  7. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  8. 使用Lucene全文检索并使用中文版和高亮显示

    使用Lucene全文检索并使用中文版和高亮显示 中文分词需要引入 中文分词发的jar 包,咱们从maven中获取 <!-- lucene中文分词器 --> <dependency&g ...

  9. Lucene 搜索的初步探究

    搜索应用程序和 Lucene 之间的关系 一般的搜索引擎都会采用这样的 Lucene 采用的是一种称为反向索引(inverted index)的机制.反向索引就是说我们维护了一个词 / 短语表,对于这 ...

随机推荐

  1. 数据返回正常 而header头Status=500

    访问接口数据成功返回,但header头Status Code:500,而调用接口的html用ajax访问一直返回500服务器错误,并且ajax一直走error,走不到success中,错误返回状态是连 ...

  2. 《算法竞赛进阶指南》1.4Hash

    137. 雪花雪花雪花 有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,-,ai,6. 因为雪花的形状是封闭的环形,所以从任何一 ...

  3. jsp 文件上传操作

    文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...

  4. 1088 Rational Arithmetic(20 分)

    For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate the ...

  5. ResourceBundle 读取properties文件中文乱码

    1.确认properties文件是什么编码格式,并确认文件在该格式下中文是正常显示的2.读取时候,进行转一层,先用ISO-8859-1读取字节流,然后根据properties的文件格式进行new St ...

  6. java——集合、泛型、ArrayList、LinkedList、foreach循环、模拟ktv点歌系统

    集合:一系列特殊的类,这些类可以存储任意类型的对象,长度可变,集合类都在java.util包中. 但是集合记不住对象的类型,当把对象从集合中取出时这个对象的编译类型就变成了Object类型.这样在取元 ...

  7. Win7 桌面图标消失

    win7 桌面图标消失或任务栏也消失,可以按Ctrl+Shift+Esc键调出任务管理器,然后点击文件——新建任务,输入explorer.

  8. Spring学习(五)事务管理

    Spring 事务管理: 一.事务概念: 1.什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的 ...

  9. 获取跨域请求的自定义的response headers

    一般情况下,使用ajax的getAllResponseHeaders这个方法只能得到response headers中的content-type的信息,其他服务器端放入response header中 ...

  10. Unity www动态加载网上图片

    一. 1.新建一个UGUI的Button,删掉它的Image组件,添加一个Raw Image组件.如图: 由于删除了Image组件,所以画圈的位置是空的,运行后会自动把Raw Image添加到那里. ...