一、倒排索引
1、什么是正向索引:
我们在使用数据库搜索数据的时候,一般使用的就是正向索引。数据库一般会根据主键id创建索引,形成一颗b+树,根据主键搜索的时候会非常快。这种就是正向索引。
但是如果根据title来模糊搜索数据,这个时候就算是给title创建索引,索引也是失效的,所以它走的是一个全表扫描然后一条一条匹配关键字进而获取到搜索数据,这样的效率是底下的。如果数据量非常庞大,这个时候还全文扫描,那性能是非常差的。
2、什么是倒排索引:
由上述的背景下,提出了倒排索引。
2.1 文档:
每条数据就是一个文档;把表中的每条数据起一个新的名称,以前叫记录,现在叫文档;
2.2 词条:
对文档的内容,按照语义分成的词语。
2.3 倒排索引的认识:
倒排索引在创建的时候,会形成一个新的表,这个表有词条和文档id。
它会把title中的字段按照语义分成一个一个词汇,比如说:“小米手机”会被分成“小米”和“手机”两个词条,然后分别存放到新的表中,然后把这个记录的id,也就是文档的id存放到文档id中。然后再分“华为手机”,分成“华为”和“手机”,但是“手机”已经有了,所以不会再次存入到词条中。然后把华为手机这个记录的id存放到词条为“华为”和“手机”的表中。
重点:需要注意的是,词条字段是不会出现重复的,它就类似一个id。所以表中不管有多少条记录,最后这些记录的id还是能被一一记录到新的表中。因为这些词条具有唯一性,这个时候可以给词条创建索引,这就是倒排索引,然后根据词条来查找数据,这个时候性能将得到很大的提升。
2.4 如何根据倒排索引来搜索
到此为止,其实我更想把这叫做分词索引,因为这样更好记和更好理解。但倒排索引显得更专业,因为我们是根据分词倒着去获取文档的id,再根据id去查询数据。
2.5 倒排索引为什么快:
虽然倒排索引要进行两次的查询,一次是根据词条查询对应的文档id,一次是根据id查询真正的文档。但这两次走的都是唯一性索引,所以速度比起只查一次的全表扫描,还是非常快的。
3、正向索引和倒排索引的对比:
正向索引是先找到文档,再判断词条是否符合要求;
倒排索引是先找到词条,再获取符合要求的文档。
两者的操作是相反的。倒排索引更适合用于一些复杂的搜索,如关键字搜索场景。