本文最开始发表的时候叫做Lucene入门,但是我发现网上大部分教程都是Lucene6以下的版本,并且很多的方法都已经过时,他们提供的代码都已经无法运行。因此改成Lucene8入门,方便学习最新版Lucene的朋友借鉴,此系列所有文章的代码均可在最新版本8.7.0上运行。初学者可能看不懂本文后半部分,只需要了解一些基本概念,然后跟着后面的文章运行代码,之后再回过头来看本文即可。

为什么要全文检索?

数据库虽然有模糊查询可以用来搜索数据,但是搜索词相差一个字符搜出来的结果却相差甚远,甚至搜索不出来。因为没有通过高效的索引方式,所以查询的速度在大量数据的情况下是很慢。

select * from 表名 where 字段名 like '%关键字%'

倒排索引(Inverted index)

很多人不是很理解这个概念,举个例子:

在数据库中,通常每条记录都会有一个id,我们是通过id查询到该记录。而通过该记录查询对应id的方式就可以理解为倒排。

一般来说,我们是通过位置来查找到内容。而如果通过内容找到位置则为倒排。

分词

就是将一段文字分成一个个单词,根据不同分词器,可能分词规则不一样。

全文检索

全文检索就是对内容进行分词,建立倒排索引的过程。

索引过程中的核心类

  1. Document文档:他是承载数据的实体(他可以集合信息域Field),是一个抽象的概念,一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。
  2. Field:索引中的每一个Document对象都包含一个或者多个不同的域(Field),域是由域名(name)和域值(value)对组成,每一个域都包含一段相应的数据信息。
  3. IndexWriter:索引过程的核心组件。这个类用于创建一个新的索引并且把文档加到已有的索引中去,也就是写入操作。
  4. Directroy:是索引的存放位置,是个抽象类。具体的子类提供特定的存储索引的地址。(FSDirectory将索引存放在指定的磁盘中,RAMDirectory将索引存放在内存中。)
  5. Analyzer:分词器,在文本被索引之前,需要经过分词器处理,他负责从将被索引的文档中提取词汇单元,并剔除剩下的无用信息(停词stopwords),分词器十分关键,因为不同的分词器,解析相同的文档结果会有很大的不同。Analyzer是一个抽象类,是所有分词器的基类。

搜索过程中的核心类

  1. IndexSearcher:IndexSearcher 调用它的search方法,用于搜索IndexWriter 所创建的索引。
  2. Term:Term使用于搜索的一个基本单元。
  3. Query: Query Lucene中含有多种查询(Query)子类。它们用于查询条件的限定其中TermQuery 是Lucene提供的最基本的查询类型,也是最简单的,它主要用来匹配在指定的域(Field)中包含了特定项(Term)的文档。
  4. TermQuery:Query下的一个子类TermQuery(单词条查询),Query lucene中有很多类似的子类。
  5. TopDocs:是一个存放有序搜索结果指针的简单容器,在这里搜索的结果是指匹配一个查询条件的一系列的文档。

Q.E.D.


擅长前端的Java程序员