lucence索引主要是通过反向索引来做到提升查询速度,我们普通的关系数据库中的查询都是正向索引。
反向索引
就像我们的字典一点,我们通过字典的目录,可以快速知道某个字在那一页。lucence将
词项
作为目录存储,每个词项存储了那些包含这个词语的文档信息,这样我们就可以快速的知道某一个词项在哪些文档里面存在了。这里词项又是什么呢?
词项
其实就是相当于英语中的一个一个的单词,如果我们的某一个字段需要做分词,那么它分词之后的每一个词语(中文)、单词(英文)我们就称之为词项,如果一个很长的话你不需要分词,那么它整个这段话就是一个词项,这种的在查询时候就是需要匹配到整个一句话才查询到了相对应的文档。
正向索引
查询就是词典里面我们一页一页的去查,查每一页里面是否包含我们的查询字段,如果一页的内容很大,那你就要看很久,所以我们在做数据查询的时候,如果对一个字段做like操作会慢。lucence的反向索引帮我们解决了这种正向索引查询慢的问题。
在我们存储词项的时候也有几种不同方式。在IndexOptions中我们可以看到它定义的枚举类型。
IndexOptions.DOCS
表示在反向索引里面我们只存储这个词项出现的文档id
IndexOptions.DOCS_AND_FREQS
表示索引中存储了文档id和词项出现的次数
IndexOptions.
DOCS_AND_FREQS_AND_POSITIONS
表示
索引中存储了文档id、词项出现的次数、词项出现的位置
IndexOptions.
DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS
表示
索引中存储了文档id、词项出现的次数、词项出现的位置、词项的偏移量
。
词项位置指的是我们对一个字段的值分词后,它是第几个词项,简单的说就是分词后是第几个词语。
偏移量就是值它在这个这段字符串里面是从哪个位置到哪里结束,相当于我们String里面的subString的截取。
当我们需要对一个字段做
短语、临近查询
的时候我们就需要存储他的位置,偏移量主要是做我们显示的时候高亮使用。
临近查询
是指两个词项之间可以间隔多少个词项。
短语查询
是指两个词项之间可以移动多少词项。这两个很相似,但是不一样,临近查询中2个词项的顺序是固定的,只能变动中间的间隔数;但短语查询词项的顺序不是固定的,第一个词项可以向左边移动最大指定的位置。比如词项A,词项B。最大跨度是10,那么词项B最大可以移动到词项A左边第9个位置,右边11个位置处;但临近查询就不行,临近查询中词项A必须在词项B的左边。
lucence里面是否也存在
正向索引
呢?答案是存在的,前面说了我们搜索的时候是通过反向索引去查找的,那为什么还需要正向索引呢,其实正向索引为的是我们做做排序、分组等功能用的,那正向索引有什么怎么存储呢?在
FieldType.setDocValuesType
方法里面我们可以设置正向索引类型。
DocValuesType.NUMERIC
类型对应的字段值只能是单值、数值;
DocValuesType.BINARY
对应的字段值只能是单值、字节数组;
DocValuesType.SORTED
对应的字段值只能单值、字符,会预先对值字节进行排序、去重存储;
DocValuesType.SORTED_SET
对应的字段值是多个值,会预先对值字节
进行排序、去重存储;
DocValuesType.SORTED_NUMERIC
类型对应字段是单值、数值数组,会预先对数值数组进行排序。
在实际应用中的选择
字符串+单值 ==>SORTED ;
字符串+多值 ==>SORTED_SET ;
数值/日期/枚举字段+单值 ==>NUMERIC;
数值/日期/枚举字段+多值 ==>SORTED_NUMERIC;