这一节介绍索引,作为一个搜索引擎,索引是搜索的核心元素,之所以搜索引擎这么快速,问题的关键也就是索引是否高效的问题,这里涉及到索引的IO,已经索引的检索,比如mysql B+树、mongodb B-树,这本质都是数据检索的侧重点不同(至于B+、B-树的数据结构差异,不了解的同学建议先网上科普,有助于存储知识体系的了解)。而我们该系列 Elasticsearch 则是基于倒排索引,我们都知道 Elasticsearch 是基于 Lucence (Apache Lucene - Welcome to Apache Lucene)开发的,lucence 楼主也用过,但现在工作侧重点不太涉及,所以这里就不铺开讲解

倒排索引&正排索引

         在解释什么是倒排索引,我们先看一个简单的倒排索引的例子

假如有两个文档:

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

如果采用正排索引,那很容易理解,就像目录一样,你只要找到对应的目录,就可以看到这个目录有哪些章节,对尚明2个简单文档进行倒排索引如下图: 


查看es的索引别名 es 查看索引_elasticsearch

                2个文档的正排索引

上图,从左到右你很明显,可以看到一个文档有哪些词语,但是你确如果基于行,如果文档数量几千万,你却很难知道一些词存在哪些文档。所以,我们就需要倒排索引了,为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 tokens ),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。


查看es的索引别名 es 查看索引_elasticsearch_02

                        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

索引操作

索引注意事项

待编辑,待完善====