这章来记录一下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全部读取到内存中进行操作,这大大提升访问速度,但是也会消耗大量的内存空间。
再从另一个角度看下lucene索引里的文件。
下面是文件是在内存还是在磁盘示意图:
这样可以一目了然的知道哪一部分相对快哪一部分相对慢了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。