也算是使用了ElasticSearch
一段时间了,可是仍是没有仔细看过Lucene
相关的内容。今天来系统小结下。java
这篇文章主要谈论Lucene
的基本架构,倒排索引
,分词器
,如何使用查询语法查询Lucene
以及Lucene
和ElasticSearch
的区别和联系。数组
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,toobash
简单来讲,倒排索引最主要的一个特色是面向term
创建索引的,而不是面向文档
创建索引的。 举个例子,假若有下面这几个文档。架构
doc1:I love ElasticSearch
doc2:I love Java
doc3:I hate sleeping
复制代码
若是使用传统面向文档的方式创建索引,那么当使用love
进行搜索的时候,须要先遍历doc1中全部的字段,再遍历doc2中全部的字段,依次遍历,直到最后一个doc,才可以肯定存在love
这个单词的文档是doc1,doc2
。elasticsearch
若是使用的是倒排索引呢?分布式
那么会组成如下的倒排索引。性能
Term | Doc |
---|---|
I | doc1,doc2,doc3 |
love | doc1,doc2 |
elasticsearch | doc1 |
java | doc2 |
sleeping | doc3 |
那么,当使用love
来搜索的时候,最多只须要遍历一遍就可以查询到结果。直接返回doc1,doc2
。优点在于只要匹配到了term
,就能够直接返回。无需像传统索引同样遍历全部的文档。spa
一段文本在Lucene
中被转化为一个一个可用于搜索的词项的过程叫作分析。有时候也会叫作分词。在Lucene
中是使用分词器来进行分析(分词)的行为的。翻译
举个例子code
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
存放。
固然,这是默认的标准分析器采用的规则。不一样的分析器可使用不一样的字符过滤器,分词器和字符映射器来完成分析的工做。
由查询内容和操做符组合而成。
首先,ElasticSearch
正是基于Lucene
开发的。相对于Lucene
拥有轻量级,独立性的特色来讲。ElasticSearch
具备的特色就是分布式,可扩展,高可用的特色。
之后这里天天都会写一篇文章,题材不限,内容不限,字数不限。尽可能把本身天天的思考都放入其中。
若是这篇文章给你带来了一些帮助,能够动动手指点个赞,顺便关注一波就更好了。
若是上面都没有,那么写下读完以后最想说的话?有效的反馈和你的鼓励是对我最大的帮助。
另外打算把博客给从新捡起来了。欢迎你们来访问吃西瓜。
我是shane。今天是2019年9月6日。百天写做计划的第四十四天,44/100。