Lucene作为最强大的开源的全文检索引擎,其倒排索引机制可以快速的根据term值找到docid,此外lucene也可以保存明细数据,通过docid将明细数据返回,并且有两种方式-行存、列存。
一次查询的流程
上图是lucene一次查询的流程,首先是从倒排索引中获取docid,之后再从行存或者列存中找到数据。只有建立索引的字段才会生成term和term对应的docid列表。当然,如果字段需要分词,就对分词器的切分后的每个分词单元建立term和对应的doclist。否则整个字段作为一个term,并建立doclist。从图中也可以看到两个关系:
1)索引与数据是独立存储的,两者之间是通过docid关联。
2)行存和列存是独立存储的,他们只和docid关联,彼此无关联。
数据存储文件结构
上图是lucene中的文件结构,其中fdx、fdt是行存数据文件,dvm、dvd是列存数据文件。
重编码
在数据存储系统中,对磁盘的占用是很敏感,因为相同的数据信息占用磁盘越多,意味着硬件成本越高,读取相同数据信息的io资源随之升高。如果按照已有的数据格式(比如java中的int、long)存储数据将会造成很大的数据浪费,可以见下图: