概述
这几天因为公司项目需要做一个文章咨询的板块。需要用的全文检索。以前没有接触过这一块。所以自己就研究了一下lucene这个搜索引擎。学了好几天也没有做笔记。现在就记录下来吧。
lucene是什么
Lucene 即全文检索,全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询的时候,根据建立的索引查找,类似于字典的检索字表查字的过程。
lucene 全文检索和 数据库检索的区别
从网上找来的图,见谅
lucene的原理
① 索引库操作原理
注意:这里面有两个关键的对象:分别是IndexWriter和indexSearcher。
执行增删改操作用的indexWriter对象,执行查询操作的是IndexSearcher对象
②索引库存放数据原理。
注意: Lucene在4.0之前和4.0之后的api发生了很大的变化。这个图中的index到后面已经不建议在使用了。后面有相应的代替方法。
后面的写法都是根据4.0以后的写法!
Lucene开发原理(索引库要与数据库同步)
数据库与索引库中存放相同的数据,可以使用数据库中存放的ID用来表示区分同一条数据。数据库中用来存放数据
索引库中用来查询、检索
检索库支持查询检索多种方式。
特点:
- 由于是索引查询,检索速度快,搜索的结果更加准确。
- 生成文本摘要。摘要截取搜索的文字出现最多的地方
- 显示查询的文字高亮
- 分词查询
注意: 添加了索引库,并不代表不往数据库中存放数据,数据库的所有操作仍然和之前一样,只不过现在多了一个维护索引库的动作。
所有的数据(对象),我们都要存放到数据库中,对于需要进行搜索的数据,还要存放到索引库中,以供搜索。一份数据同时存放到数据库与索引库中,(格式不同),就需要就需要想办法保证他们的状态一直,否则就会影响搜索结果
对于如何维护索引库,在数据库中做了相应操作后,在索引库中也做相应的操作。具体的索引库操作。是通过调用相应的indexDao方法完成的。indexDao类似于数据库中的Dao
索引库中存放的数据需要转换成Document对象(每条数据就是一个Document对象),并向Document对象中存放Field对象(每条数据对应的字段,例如主键ID,所属单位,文件名称,备注),将每个字段中的至都存放到Field对象中。
开发准备
环境准备
idea
spring boot
pom文件
pom文件添加依赖
<!-- lucence核心包 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>5.3.1<version>
</dependency>
<!-- lucence 查询解析包 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>5.3.1<ersion>
</dependency>
<!-- 分词高亮 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>5.3.1<ersion>
</dependency>
<!-- 支持中文分词 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-smartcn</artifactId>
<version>5.3.1<ersion>
</dependency>
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6<ersion>
<dependency>
注意:我这里使用的是IK分词器,这个东西比较古老。所以看到的人还是自行去maven仓库搜索Smart的分词器吧。也是支持中文分词的。用法一样只不过创建分词器对象的时候类不一样而已!
yml文件修改
我这里是吧application.proerties
文件修改成了application.yml
文件
spring:
// 数据库引入
datasource:
url: jdbc:mysql://localhost:3306/sys_article?characterEncoding=utf8&useSSL=true
password:
driver-class-name: com.mysql.jdbc.Driver
username:
// 这里使用的jpa 持久层使用的jpa特别方便
jpa:
hibernate:
ddl-auto: update
show-sql: true
jackson:
serialization:
indent_output: true
thymeleaf:
cache: false
prefix: classpath:templatesiews/
suffix: .html
server:
// 服务端口号
port: 8090
// 访问路径
servlet:
context-path: /article