这一节介绍索引,作为一个搜索引擎,索引是搜索的核心元素,之所以搜索引擎这么快速,问题的关键也就是索引是否高效的问题,这里涉及到索引的IO,已经索引的检索,比如mysql B+树、mongodb B-树,这本质都是数据检索的侧重点不同(至于B+、B-树的数据结构差异,不了解的同学建议先网上科普,有助于存储知识体系的了解)。而我们该系列 Elasticsearch 则是基于倒排索引,我们都知道 Elasticsearch 是基于 Lucence (Apache Lucene - Welcome to Apache Lucene)开发的,lucence 楼主也用过,但现在工作侧重点不太涉及,所以这里就不铺开讲解
倒排索引&正排索引
在解释什么是倒排索引,我们先看一个简单的倒排索引的例子
假如有两个文档:
- The quick brown fox jumped over the lazy dog
- Quick brown foxes leap over lazy dogs in summer
如果采用正排索引,那很容易理解,就像目录一样,你只要找到对应的目录,就可以看到这个目录有哪些章节,对尚明2个简单文档进行倒排索引如下图:
2个文档的正排索引
上图,从左到右你很明显,可以看到一个文档有哪些词语,但是你确如果基于行,如果文档数量几千万,你却很难知道一些词存在哪些文档。所以,我们就需要倒排索引了,为了创建倒排索引,我们首先将每个文档的 content
域拆分成单独的 词(我们称它为 词条
或 tokens
),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。
2个文档倒排索引
现在,如果我们想搜索某个词,比如summer,那么可以很方便的知道 doc_2 存在该词。如你搜索 Quick brown,你可以很方便知道doc_1 存在 brown,doc_2 存在Quick brown,仅计算匹配词条,我们知道明显doc_2相关性要高一点
注意:ES内部其实也用有模块是用到正排索引的,如doc values和fielddata
索引分析器
索引映射
字段分析器可以从三个层面进行定义:按字段(per-field)、按索引(per-index)或全局缺省(global default)。Elasticsearch 会按照以下顺序依次处理,直到它找到能够使用的分析器。索引时的顺序如下:
- 字段映射里定义的
analyzer
,否则 - 索引设置中名为
default
的分析器,默认为 -
standard
标准分析器
在搜索时,顺序有些许不同:
- 查询自己定义的
analyzer
,否则 - 字段映射里定义的
search_analyzer
,否则 - 字段映射里定义的
analyzer
,否则 - 索引设置中名为
default_search
的分析器,默认为 - 索引设置中名为
default
的分析器,默认为 -
standard
标准分析器
注意:有时在索引时和搜索时使用不同的分析器是合理的。我们可能要想为同义词建索引(例如,所有
quick
出现的地方,同时也为fast
、rapid
和speedy
创建索引)。但在搜索时,我们不需要搜索所有的同义词,取而代之的是寻找用户输入的单词是否是quick
、fast
、rapid
或speedy
索引操作
索引注意事项
待编辑,待完善====