前言

也算是使用了ElasticSearch一段时间了,但是还是没有仔细看过Lucene相关的内容。今天来系统小结下。

这篇文章主要谈论Lucene的基本架构,倒排索引分词器,如何使用查询语法查询Lucene以及LuceneElasticSearch的区别和联系。

Lucene

基本架构

  • 文档:索引和搜索的主要的数据载体,包含多个字段。
  • 字段:多个字段组成一个文档。包含具体的信息。
  • 词项:由term翻译而来。可以简单理解为具体的信息中拆分出来的一个个单词。
  • 词条:由token翻译而来。词项在文本中的一次出现。不仅包含词项的内容,而且包含开始的位置,结束的位置等信息。
  • 段:由Segment翻译而来。每个段只会被创建一次,段一但被创建了之后就不会被修改。所以,会存在段合并的过程,减少段的数量,而且搜索的性能也会提升。段中数据的删除只会在段合并的过程中进行。
term和token的区别是什么?
举个例子,有下面一段文本。My brother love ElasticSearch.I love ElasticSearch,too.
token为My,brother,love,ElasticSearch,I,love,ElasticSearch,too
term为My,brother,love,ElasticSearch,I,too

倒排索引

简单来说,倒排索引最主要的一个特点是面向term建立索引的,而不是面向文档建立索引的。
举个例子,假如有下面这几个文档。

doc1:I love ElasticSearch
doc2:I love Java
doc3:I hate sleeping

如果使用传统面向文档的方式建立索引,那么当使用love进行搜索的时候,需要先遍历doc1中所有的字段,再遍历doc2中所有的字段,依次遍历,直到最后一个doc,才能够确定存在love这个单词的文档是doc1,doc2

如果使用的是倒排索引呢?

那么会组成以下的倒排索引。

Term Doc
I doc1,doc2,doc3
love doc1,doc2
elasticsearch doc1
java doc2
sleeping doc3

那么,当使用love来搜索的时候,最多只需要遍历一遍就能够查询到结果。直接返回doc1,doc2。优势在于只要匹配到了term,就可以直接返回。无需像传统索引一样遍历所有的文档。

分词器

一段文本在Lucene中被转化为一个一个可用于搜索的词项的过程叫做分析。有时候也会叫做分词。在Lucene中是使用分词器来进行分析(分词)的行为的。

举个例子

I love ElasticSearch  ->  [I,love,elasticsearch]

这里就是原来的文本被分词器转换为多个词项。

文本分析由分析器执行,而分析器又由字符过滤器,分词器和字符映射器组成。

那么这三个组成又分别有什么作用呢?

举个例子。存在下面这样文本。

I love! ElasticSearch.

经过了字符过滤器之后

I love! ElasticSearch.   -> I lvoe ElasticSearch

字符过滤器是去掉在原本文本中存在的一些不合适的字符,比如.等。过滤器将原本存在多种不合适的字符流转化为合适的字符流。

接着,会经过分词器。

I love ElasticSearch -> [I,love,ElasticSearch]

分词器会原来的字符流转化为多个词项的数组。最终可以通过这些词项搜索。

[I,love,ElasticSearch] -> [I,love,elasticsearch]

最后,字符映射器会将最原始的词项统一格式,比如都转化为小写的词项。这个被转化后的词项才会被Lucene存放。

当然,这是默认的标准分析器采用的规则。不同的分析器可以使用不同的字符过滤器,分词器和字符映射器来完成分析的工作。

查询语法

由查询内容和操作符组合而成。

Lucene与ElasticSearch的联系

首先,ElasticSearch正是基于Lucene开发的。相对于Lucene拥有轻量级,独立性的特点来说。ElasticSearch具有的特点就是分布式,可扩展,高可用的特点。

关于写作

以后这里每天都会写一篇文章,题材不限,内容不限,字数不限。尽量把自己每天的思考都放入其中。

如果这篇文章给你带来了一些帮助,可以动动手指点个赞,顺便关注一波就更好了。

如果上面都没有,那么写下读完之后最想说的话?有效的反馈和你的鼓励是对我最大的帮助。

另外打算把博客给重新捡起来了。欢迎大家来访问吃西瓜

我是shane。今天是2019年9月6日。百天写作计划的第四十四天,44/100。


shane
2 声望1 粉丝