概述

这几天因为公司项目需要做一个文章咨询的板块。需要用的全文检索。以前没有接触过这一块。所以自己就研究了一下lucene这个搜索引擎。学了好几天也没有做笔记。现在就记录下来吧。

lucene是什么

Lucene 即全文检索,全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询的时候,根据建立的索引查找,类似于字典的检索字表查字的过程。

lucene 全文检索和 数据库检索的区别

从网上找来的图,见谅

lua sub 索引_搜索

lucene的原理

① 索引库操作原理

lua sub 索引_lucene_02

注意:这里面有两个关键的对象:分别是IndexWriter和indexSearcher。
执行增删改操作用的indexWriter对象,执行查询操作的是IndexSearcher对象

②索引库存放数据原理。

lua sub 索引_搜索_03

注意: Lucene在4.0之前和4.0之后的api发生了很大的变化。这个图中的index到后面已经不建议在使用了。后面有相应的代替方法。

后面的写法都是根据4.0以后的写法!

Lucene开发原理(索引库要与数据库同步)

lua sub 索引_lucene_04

数据库与索引库中存放相同的数据,可以使用数据库中存放的ID用来表示区分同一条数据。
数据库中用来存放数据索引库中用来查询、检索 检索库支持查询检索多种方式。
特点:

  1. 由于是索引查询,检索速度快,搜索的结果更加准确。
  2. 生成文本摘要。摘要截取搜索的文字出现最多的地方
  3. 显示查询的文字高亮
  4. 分词查询

注意: 添加了索引库,并不代表不往数据库中存放数据,数据库的所有操作仍然和之前一样,只不过现在多了一个维护索引库的动作。
所有的数据(对象),我们都要存放到数据库中,对于需要进行搜索的数据,还要存放到索引库中,以供搜索。一份数据同时存放到数据库与索引库中,(格式不同),就需要就需要想办法保证他们的状态一直,否则就会影响搜索结果

对于如何维护索引库,在数据库中做了相应操作后,在索引库中也做相应的操作。具体的索引库操作。是通过调用相应的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