/**
* 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. EOS多节点同步代码分析

    EOS version: 1.0.7 一. 配置文件的修改 EOS的节点同步流程是通过p2p来完成,在nodeos的配置文件config.ini中填写,其默认路径为~/.local/share/eos ...

  2. LightOJ 1336 - Sigma Function

    原题链接 基础数论中很经典的一道题 题意 给出了σ(n)的计算公式,让你找出整数1-n中有多少对应σ(n)的值是偶数. 思路 观察σ(n)的公式发现,每一个乘项都是 (piei+1 - 1) / (p ...

  3. Age of Moyu (2018 Multi-University Training Contest 7)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll read(){ ,f= ...

  4. shell学习(11)- seq

    今天是五一劳动节,窗户外边,草长莺飞,惠风和畅,但坐在办公室里值班也需要做点事情,今天就写写seq的用法. 作用:用于以指定增量从首数开始打印数字到尾数,即产生从某个数到另外一个数之间的所有整数,并且 ...

  5. maven项目打包分析及打包后war包缺少配置文件报错的原因分析,使用progard混淆时配置分析

    1.maven打包: 一直以来我都没太注意过在myeclipse下使用run as来clean居然对项目的target目录没有进行操作,要让操作有效,需要进入到maven build...选项下,进行 ...

  6. 使用JMeter进行API功能测试

    使用JMeter进行API功能测试 Apache JMeter是一种流行的开源软件,用于性能测试. 在本博客中,我们将阐明如何使用JMeter for REST API自动化进行功能测试. 我们使用了 ...

  7. (转)Linux之split命令详解

    Linux之split命令详解 原文:http://m.jb51.net/article/73632.htm Linux split命令用于将一个文件分割成数个,该指令将大文件分割成较小的文件,在默认 ...

  8. mysql日常使用总结(持续更新中)

    记录一些日常的mysql常用的使用, 方便随用随查. 一.表结构 1.1 查看表结构 方式1: 可以查看建表语句,完整的表结构. show create table table_name; 方式2:可 ...

  9. Windows10 zip安装 MySQL8.0.12

    其实问题不大,就是win10永远有点奇葩的地方. 下载,解压,命名什么的我就不说了. 一 环境变量方便cmd使用mysql MYSQL_HOME = xxx // 就是安装的路径 Path = %MY ...

  10. EditPlus常用操作

    EditPlus注册码在线生成 http://www.jb51.net/tools/editplus/ 随意填写个用户名,生成对应的密码就可以使用editplus了 EditPlus常用快捷键 编代码 ...