Lucene02--入门程序

开发准备:

Win10

IDEA

JDK1.8

1、新建一个普通的maven工程

1.1 添加依赖

    <dependencies>
<!-- Junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- lucene核心库 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>7.4.0</version>
</dependency>
<!-- Lucene的查询解析器 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>7.4.0</version>
</dependency>
<!-- lucene的默认分词器库 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>7.4.0</version>
</dependency>
<!-- lucene的高亮显示 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>7.4.0</version>
</dependency>
</dependencies>

1.2 创建测试类

2、往索引库中写入文档

2.1 基本流程

步骤:

2.1.1 创建索引库对象,指定索引库的位置

2.1.2 创建IndexWriterConfig对象并制定分词对象

2.1.3 创建一个IndexWriter对象

1)指定索引库的位置

2)指定一个IndexWriterConfig对象。

2.1.4 创建document对象。

2.1.5 创建field对象,将field添加到document对象中。

2.1.6 使用indexwriter对象将document对象写入索引库中。

2.1.7 关闭indexwriter对象。

2.2 代码实现

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test; import java.io.File;
import java.io.IOException;
import java.nio.file.Path; /**
* @author PC-Black
* @version v1.0
* @date 2019/7/19 10:00
* @description TODO
**/
public class LuceneTest { @Test
public void addOneDoc() throws IOException {
// 1 创建索引库对象,指定索引库的位置
//1.1 创建索引库位置
Path path = new File("D:\\lucene").toPath();
//1.2 创建索引库对象,关联索引库位置
FSDirectory directory = FSDirectory.open(path);
// 2 创建IndexWriterConfig对象并指定分词器对象
//2.1 创建分词器对象用于指定分词规则
StandardAnalyzer standardAnalyzer = new StandardAnalyzer();//标准分词器,分词规则:单字分词
//2.2 创建写出器配置对象,关联分词器对象
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(standardAnalyzer);
// 3 创建一个IndexWriter对象 &指定索引库的位置&指定一个IndexWriterConfig对象。
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
// 4 创建document对象。
Document document = new Document();
// 5 创建field对象,将field添加到document对象中。
// 5.1 创建field对象
StringField docIdField = new StringField("docId", "1", Field.Store.YES);
TextField titleField = new TextField("title", "我的祖国", Field.Store.YES);
TextField contentField = new TextField("content", "我的祖国是一个伟大的国家", Field.Store.YES);
StringField scoreField = new StringField("score", "100", Field.Store.YES);
//5.1 将field添加到document对象中。
document.add(docIdField);
document.add(titleField);
document.add(contentField);
document.add(scoreField);
// 6 使用indexwriter对象将document对象写入索引库中。
indexWriter.addDocument(document);
// 7 关闭indexwriter对象。
indexWriter.close(); }
}

2.3 运行addOneDoc()方法

2.4 查看索引库生成的位置

2.5 使用Luke工具查看索引

注意:我们使用的luke版本是luke-7.4.0,跟Lucene的版本是对应的。所以可以打开7.4.0版本的Lucene创建的索引库。并且此版本的luke是jdk9编译的,所以要想运行此工具还需要jdk9才可以

3、在索引库中查询文档

3.1 查询流程

步骤:

3.1.1 创建索引库对象,指定索引库位置。

3.1.2 创建索引读取对象(IndexReader),指定索引库对象。

3.1.3 创建索引查询器对象(IndexSearcher),指定索引读取对象。

3.1.4 创建TermQuery对象,指定查询的域和查询的关键词。

3.1.5 使用索引查询器对象执行查询方法。

3.1.6 返回查询结果。遍历查询结果并输出。

3.1.7 关闭IndexReader对象。

3.2 代码实现

    @Test
public void queryDoc() throws IOException {
// 1 创建索引库对象&指定索引库位置。
FSDirectory fsDirectory = FSDirectory.open(new File("D:\\lucene").toPath());
// 2 创建索引读取对象(IndexReader),指定索引库对象。
// DirectoryReader open = DirectoryReader.open(fsDirectory);
//2.1 使用子类创建,父类引用
IndexReader indexReader = DirectoryReader.open(fsDirectory);
// 3 创建索引查询器对象(IndexSearcher),指定索引读取对象。
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4 创建分词查询对象(TermQuery),指定查询的域和查询的关键词。
TermQuery termQuery = new TermQuery(new Term("title", "我"));
// 5 使用索引查询器对象执行查询方法。 参数一:查询条件 参数二:搜索的记录条数
TopDocs topDocs = indexSearcher.search(termQuery, 10);
// 6 返回查询结果。遍历查询结果并输出。
//6.1 获取查询到的结果
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
//6.2 遍历查询结果
for (ScoreDoc scoreDoc : scoreDocs) {
//6.3 获取文档id,即docId
int docId = scoreDoc.doc;
//6.4 使用indexSearcher对象,根据docId获取document对象
Document document = indexSearcher.doc(docId);
//6.5 获取每个字段的值
if (null != document) {
String title = document.get("title");
String content = document.get("content");
String score = document.get("score");
System.out.println("docId=" + docId);
System.out.println("title=" + title);
System.out.println("content=" + content);
System.out.println("score=" + score);
} }
// 7 关闭IndexReader对象。
indexReader.close();
}

3.3 运行queryDoc方法

查看控制台,我们发现没有查到数据。

因为创建索引库写入文档时,我们使用的是标准的分词规则:即按照单字分词的。而我们查询的时候,查询的字段是title,查询的关键词是“我的”。title中并没有这个分词,所以找不到。

将关键词修改成“我”,再执行查询下:

Lucene02--入门程序的更多相关文章

  1. mybatis入门_mybatis基本原理以及入门程序

    一.传统jdbc存在的问题 1.创建数据库的连接存在大量的硬编码, 2.执行statement时存在硬编码. 3.频繁的开启和关闭数据库连接,会严重影响数据库的性能,浪费数据库的资源. 4.存在大量的 ...

  2. 1.struts2原理和入门程序

    Struts2是一个MVC的Web应用框架,是在Struts1和WebWork发展起来的,以WebWork为核心,采取拦截器机制来处理用户请求. 原理图: 分析步骤: 1.用户发送一个请求 2.请求的 ...

  3. springMVC2 1入门程序

    1入门程序 .1需求 实现商品列表查询 .2需要的jar包 使用spring3.2.0(带springwebmvc模块) .1前端控制器 在web.xml中配置: <?xml version=& ...

  4. struts2入门程序

    struts2入门程序 1.示例 搭建编程环境就先不说了,这里假设已经搭建好了编程环境,并且下好了strut2的jar包,接下来程序. 1.1 新建web项目 点击File->New->D ...

  5. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  6. springmvc(一) springmvc框架原理分析和简单入门程序

    springmvc这个框架真的非常简单,感觉比struts2还更简单,好好沉淀下来学习~ --WH 一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解 ...

  7. python web入门程序

    python2.x web入门程序 #!/usr/bin/python # -*- coding: UTF-8 -*- # 只在python2.x 有效 import os #Python的标准库中的 ...

  8. Maven01——简介、安装配置、入门程序、项目构建和依赖管理

    1 Maven的简介 1.1 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 Svn eclipse   maven量级 1.2 Maven好处 同 ...

  9. ssm整合快速入门程序(一)

    整合基础说明 spring 是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于2003 年兴起的一个轻量级的Jav ...

  10. Mybatis入门程序

    作为一个java的学习者,我相信JDBC是大家最早接触也是入门级别的数据库连接方式,所以我们先来回忆一下JDBC作为一种用于执行SQL语句的Java API是如何工作的.下面的一段代码就是最基本的JD ...

随机推荐

  1. Delphi的对象注销方法Destroy和free

    当您使用完对象后,您应该及时撤销它,以便把这个对象占用的内存释放出来.您可以通过调用一个注销方法来撤销您的对象,它会释放分配给这个对象的内存. Delphi的注销方法有两个:Destroy和Free. ...

  2. DELPHI美化界面(2009开始TPanel增加了ParentBackGround)

    1.透明问题. 要重新调整界面确实很麻烦,以前用DELPHI开发的界面都很土,和WEB真是没办法比.(我以前用的是DELPHI7),现在回想起来,DELPHI难做的原因是:没有透明控件.所有控件都是不 ...

  3. 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))

    注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...

  4. qt中文编码(好多方法)

    qt中文编码 来源:http://www.cublog.cn/u1/59481/showart_1947231.html 前些日子,被编码折磨了一段时间,总结一下Qt中的编码. [Qt 编码简单实验] ...

  5. Qt4.8.6详细安装步骤(使用了i686-4.8.2-release-posix-dwarf-rt_v3-rev3,手动设置gcc和gdb)非常清楚 good

    摘要 在网上查看了很多篇关于Qt 4的安装方法,都是以前很久的帖子,所以就想按自己的方式重新总结一下,希望可以帮助到大家. Qt5的安装比较简单只需要下载一个文件qt-opensource-windo ...

  6. layui打印表格自定义函数

    函数如下 function print (tablelayid) { var v = document.createElement("div"); var f = ["& ...

  7. 核心思想:自由职业的所谓自由,必须先职业,然后才能自由(还要对抗自己的惰性,提前寻找客户)good

    除了前面提到的专业性,还要足够自律,能够管理好自己的时间和精力. 具体来说,需要目标管理和时间(精力)管理. 所谓目标管理,对于自由职业者来讲,就是要识别出自己最擅长的方向,确立自己可以提供的最有价值 ...

  8. .NET Core RC2在Linux下部署

    前言 目前ASP.NET Core RC2已经正式发布了,可以参考如下链接: https://blogs.msdn.microsoft.com/dotnet/2016/05/06/net-core-r ...

  9. Python基础(六) 函数

    .函数 函数是对动作的封装 2.1函数的基本结构 #函数的定义 def 函数名(): #函数提 pass #函数的执行 函数名() 2.2参数初识 #形参 def hanshu(aaa): #参数相当 ...

  10. SYN1618型 高精度天文时间同步系统

       SYN1618型 高精度天文时间同步系统 产品概述 SYN1618型 高精度天文时间同步系统是由西安同步电子科技有限公司精心设计.自行研发生产的一款高精度的时频频率标准设备,接收GPS.GLON ...