ElasticSearch 中可以进行全文索引,而且可以快速的将数据从海量的数据中提取出来, 其中倒排索引是ElasticSearch 中比较核心的处理数据的概念。那么理解倒排序是理解ElasticSearch 快速处理数据的一个关键.
在说倒排索引之前,我们其实应该明白什么是正排索引,这里的索引并非是我们通常理解的传统数据库中 INDEX 的 ASC , DESC 的意思.
正排索引, 是一个数据库结构,一个将文档中的词和文档之间进行关联的功能,
首先他将扫描文档中的所有单词,将单词添加到索引的页面当中,直到将文档中的所有词都遍历一遍,如果在一个文档中,查询某个单词的速度是非常快的,而如果要变为搜索所有文档中的某一个关键词就难了. 文档越多,则查询的速度会越来越慢.
正排序, 每个文档都会扫描出一些关键字, 所以如果在一个文档中找到对应的字是很简单的,快速的, 但反过来,如果要通过"我"字查询到有多少文档有这个字,那就麻烦了文档越多,遍历的时间就越长.
所以在目前的状态下, 查询的效率被挑战, 就必须通过其他的方法来快速查询的设计.
这里就需要另一个方法来进行查询, inverted index 倒排索引,通过将上面的数据存储的结构反过来通过"词" 作为索引的主结构, 通过搜寻文档来获得所有的词,
在搜索文档中的词的时候,如果这个条目在索引的原结构上没有,则创建新的词标签,如果有的情况下,将添加这个词发现的位置到这个词所在的索引列.
在DNS 系统中的, DNS LOOP 可以理解为正排, 而在 DNS 系统中的
Reverse lookup 就为相关的倒排序.
同时我们还可以在加大利用这个倒排序的方式, 例如加入 文档1 中存在 我字的个数也都添加到倒排序的信息中.
在建立以关键词为主的索引的过程中,词典结构也会相应地被构建出来。比如在解析一个新文档的时候,对于某个在文档中出现的单词T,首先利用哈希函数获得其哈希值,之后根据哈希值对应的哈希表项读取其中保存的指针,就找到了对应的冲突链表。如果冲突链表里已经存在这个单词,说明单词在之前解析的文档里已经出现过。如果在冲突链表里没有发现这个单词,说明该单词是首次碰到,则将其加入冲突链表里。通过这种方式,当文档集合内所有文档解析完毕时,相应的词典结构也就建立起来了。
通过这样的结构设计,ES 可以承担起全文索引的问题.