域 (Field)的元数据信息 (.fnm)
一个段(Segment)包含多个域,每个域都有一些元数据信息,保存在.fnm 文件中,.fnm 文件格式如下
1.FNMVersion
是 fnm文件的版本号,对于 Lucene 2.9为-2
2.FieldsCount
域的数目
3. 一个数组的域(Fields)
1) FieldName:域名,如"title","modified","content"等。
2)FieldBits:一系列标志位,表明对此域的索引方式
最低位:1 表示此域被索引,0 则不被索引。所谓被索引,也即放到倒排表中去。
仅仅被索引的域才能够被搜到。
Field.Index.NO则表示不被索引。
Field.Index.ANALYZED 则表示不但被索引,而且被分词,比如索引"hello world"后,无论是搜"hello",还是搜"world"都能够被搜到。
Field.Index.NOT_ANALYZED表示虽然被索引,但是不分词,比如索引"hello world"后,仅当搜"hello world"时,能够搜到,搜"hello"和搜"world"都搜不到。
3)一个域出了能够被索引,还能够被存储,仅仅被存储的域是搜索不到但是能通过文档号查到,多用于不想被搜索到,但是在通过其它域能够索到的情况下,能够随着文档号返回给用户的域。
4) Field.Store.Yes则表示存储此域,Field.Store.NO则表示不存储此域。
5)倒数第二位:1 表示保存词向量,0 为不保存
Field.TermVector.YES表示保存词向量。
Field.TermVector.NO表示不保存词向量。
6)倒数第三位:1 表示在词向量中保存位置信息
Field.TermVector.WITH_POSITIONS
7)倒数第四位:1 表示在词向量中保存偏移量信
Field.TermVector.WITH_OFFSETS
8)倒数第五位:1 表示不保存标准化因子
Field.Index.ANALYZED_NO_NORMS
Field.Index.NOT_ANALYZED_NO_NORMS
9)倒数第六位:是否保存 payload
4.位置(Position)和偏移量(Offset)的区别
位置是基于词 Term的,偏移量是基于字母或汉字的。
5. payload的使用
1)我们知道,索引是以倒排表形式存储的,对于每一个词,都保存了包含这个词的一个链表,当然为了加快查询速度,此链表多用跳跃表进行存储。
2)Payload 信息就是存储在倒排表中的,同文档号一起存放,多用于存储与每篇文档相关的一些信息。当然这部分信息也可以存储域里(stored Field),两者从功能上基
本是一样的,然而当要存储的信息很多的时候,存放在倒排表影响词的评分
3)在 Similarity 抽象类中有函数 public float scorePayload(byte [] payload, int offset, int length) 可以根据 payload的值影响评分。 里,利用跳跃表,有利于大大提高搜索速度。