为何Lucene大数据量搜索快, 要分两部分来看:
    一点是因为底层的倒排索引存储结构
    另一点就是查询关键字的时候速度快 , 因为词典的索引结构

    image.png

    词典数据结构对比:
    倒排索引中的词典位于内存,其结构尤为重要,有很多种词典结构,各有各的优缺点,最简单如排序数组,通过二分查找来检索数据,更快的有哈希表,磁盘查找有B树、B+树,但一个能支持TB级 数据的倒排索引结构需要在时间和空间上有个平衡,下图列了一些常见词典的优缺点:

    很多数据结构均能完成字典功能,总结如下

    数据结构 说明
    排序列表Array/List 使用二分法查找,不平衡
    HashMap/TreeMap 性能高,内存消耗大,几乎是原始数据的三倍
    SkipList 跳跃表,可快速查找词语,在lucene、redis、Hbase等均有实现。相对于TreeMap等结构,特别适合高并发场景
    Trie 适合英文词典,如果系统中存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存
    DoubleArrayTrie 适合做中文词典,内存占用小,很多分词工具均采用此种算法
    TernarySearchTree 三叉树,每一个node有3个节点,兼具省空间和查询快的优点
    FiniteStateTransducers(FST) 一种有限状态转移机,Lucene4有开源实现,并大量使用

    FST的结构

    image.png
    优点:内存占用率低,压缩率一般在3倍~20倍之间、模糊查询支持好、查询快
    缺点:结构复杂、输入要求有序、更新不易