Elasticsearch是面向文档型数据库,一条数据在这里就是一一个文档。为了方便理解,将Elasticsearch 里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比。
在ES中想查询一条数据,也会按照类似数据库的规则,比如索引、类型、文档、字段等,按照这个规则去进行查询,那么早期版本这么设计是没有任何问题的,可是这种概念违背了全文检索的原则和基本事项。什么意思呢?首先说一下索引的问题,在关系数据库中,索引其实是为了优化查询所设计的数据库对象,没有它索引也能查询,就是慢。而ES软件专门用于全文检索数据,所以索引是整个搜索引擎当中的关键,甚至可以说在搜索引擎中万物皆索引也不会过。那么ES中为了能够做到快速准确的查询,使用了一个特殊的概念来进行数据的存储和查询,这个概念称之为叫倒排索引。那么有倒排索引就应该有正排索引。正排索引也叫正向索引。
举个例子,比如保存一篇文章,那么里面应该有文章编号、文章内容、作者以及发布时间。
现在,可以通过文章编号去快速查询到文章的内容,那么之所以检索是比较快的,是因为将文章编号设定为主键,同时生成主键索引,然后通过主键索引快速关联到它们存储的信息,那么这种索引就称之为叫正向索引,也称之为叫正牌索引。可是,如果想要查询文章的内容中包含了哪些热门词汇,那么这个时候会比较麻烦了,因为需要做模糊查询,模糊查询的效率就明显差了很多,而且每条数据都要遍历一下,那么性能会差很多,而且查询内容的大小写,时态等等都会影响查询的准确率。
比如我想查询Zhangsan,那如果你的是这个zhangsan怎么办?要查还是不查?你这边是小写,那我想查的是大写,那你说它算不算?它是算匹配的还是不匹配的呢?所以这都会影响到查询准确率。所以,这就需要换一种方式来将索引和数据关联,这就需要用到之前所提到的倒排索引。举个例子,现在将这个id保存的数据保持不变,但是索引不像刚才的了,需要换一种方式,写一个叫keyword关键字与文章的id做一个关联。
如果现在要查询zhangsan的zhang,而文章中保存了一个zhang,那么就会马上关联到1001。所以就会发现现在是通过关键字来查询主键id,然后再关联到文章内容,以前是通过主键id关联文章内容再去找它的关键字,所以正好跟之前是相反的,这个就统称为叫倒排索引。倒排索引,其实会发现它的查询效率应该是比较快的,但是不会体现表的概念。它强调的是关键字和这个文档编号的一个关联,所以那个表的作用已经没有那么明显了。
ES里的Index可以看做一个库,而types相当于表,Documents 则相当于表的行。这里Types的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个index下已经只能包含一个type,Elasticsearch7.X中,Type的概念已经被删除了。