倒排索引机制
搜索的核心需求是全文匹配,对于全文匹配,数据库的索引排不上用场,就只能全表扫描,并且还需要在每条记录上做全文匹配,就是一个字一个字对比。
为了能够支持快速全文搜索,ES采用了一种特殊的索引,倒排索引。
倒排索引的构建,当我们往ES写入商品记录的时候,ES会先对需要搜索的字段就是商品标题进行分词(就是把一段文本按照语义拆分成多个单词)。然后ES按照单词来给商品记录做索引,就形成了像表一样的倒排索引。
ES是为搜索而生的,但是本质上,任然是一个存储系统。
![a465d67586b3fb21f719bf7c70b92876.png](https://i-blog.csdnimg.cn/blog_migrate/4d1dcca187ecfefc140af8405f8d9575.png)
在 ES 里面,数据的逻辑结构类似于 MongoDB,每条数据称为一个 DOCUMENT,简称 DOC。DOC 就是一个 JSON 对象,DOC 中的每个 JSON 字段,在 ES 中称为 FIELD,把一组具有相同字段的 DOC 存放在一起,存放它们的逻辑容器叫 INDEX,这些 DOC 的 JSON 结构称为 MAPPING。这里面最不好理解的就是这个 INDEX,它实际上类似于 MySQL 中表的概念,而不是我们通常理解的用于查找数据的索引。
ES 本质上是一个支持全文搜索的分布式内存数据库,特别适合用于构建搜索系统。ES 之所以能有非常好的全文搜索性能,最重要的原因就是采用了倒排索引。倒排索引是一种特别为搜索而设计的索引结构,倒排索引先对需要索引的字段进行分词,然后以分词为索引组成一个查找树,这样就把一个全文匹配的查找转换成了对树的查找,这是倒排索引能够快速进行搜索的根本原因。
但是,倒排索引相比于一般数据库采用的 B 树索引,它的写入和更新性能都比较差,因此倒排索引也只是适合全文搜索,不适合更新频繁的交易类数据。