这章来记录一下lucene里的segment。segment是索引中最小的独立存储单元。一个索引文件由一个或多个段组成。segment外部次要有:
- Inverted Index
- Sorted Fields
- Document Values
- Cache
Inverted Index
最为重要,它次要包含两局部:
- 一个有序的数据字典(包含单词Term和它呈现的频率)
- 与单词Term对应的Postings(即倒排表,存单词的文件)
当咱们搜寻时,首先将搜寻的内容合成,而后在字典里找到对应的Term,从而查找到与搜寻相干的文件内容。
依据上图内容,举几个查问例子。
- 查问'the fury'
还记得上一章介绍的lucene四种检索里的‘AND’形式吗?Lucene基本知识 - 主动补全(AutoCompletion-Prefix)
如果想查找字母‘c‘结尾的单词,可能简略通过二分查找在Inverted Index表中找到例如'choice','coming'这样的词(Term) - 低廉的查找
如果想要查找所有蕴含'our'字母的单词,那么零碎会扫描整个Inverted Index,这是十分低廉的。
在此状况下,如果想要做优化,那么咱们面对的问题是如何生成适合的Term。个别有上面这些计划:
1) suffix -> xiffus ,如果咱们想当前缀作为搜寻条件,能够为Term做反向解决
2) (60.6384, 6.5017) -> u4u8gyykk
对于GEO地位信息,能够将它转换成GEO Hash
3) 123 -> {1-hundreds, 12-tens, 123}
对于简略的数字,能够为它生成多重模式的Term - 解决拼写错误
一个python库为单词生成了一个蕴含谬误拼写信息的树形状态机,解决拼写错误的问题。
Stored Field字段查找(待具体补充)
当咱们想要查找蕴含某个特定题目内容的文件时,Inverted Index就不能很好的解决这个问题,所以lucene提供了另外一种数据结构Stored Fields来应答这个问题,实质上,Stored Fields是一个简略的键值对key-value。默认状况下,ES会存储整个文件的JSON source.
Document Values为了排序,聚合(待具体补充)
Document values是为了解决排序,聚合,facet问题的,DV构造实质上是一个列式的存储,它高度优化了具备雷同类型的数据的存储构造。
为了提高效率,ES能够将索引下某一个Document Value全副读取到内存中进行操作,这大大晋升访问速度,然而也会耗费大量的内存空间。
参考文章:ES详解 - 原理:从图解构筑对ES原理的初步认知