Field 详解
使用analyzer 分析,将分析得到的字段 用于索引,
的变体,区别是, 存储了index-time boost information等norms,而 不存储,这会在search的时候节约内存空间
这个field不能被search
不使用 analyzer分析,整体作为一个token,常用语精确匹配,例如 文件名,ID等就用这个。
2、index是否存储term vector
term 就是analyzer分词后的词组。 每一个document 都含有一个term vector 存储了这个document含有的term(unique,如果某个term出现多次也只存一个),以及这个term出现在field 中的position,以及offset。这些信息可以用来以后高亮一个选中的term等等。
用Field.Store.YES,Field.Store.NO来表示
term 就是analyzer分词后的词组。 每一个document 都含有一个term vector。它 存储了这个document含有的term(unique,如果某个term出现多次也只存一个),以及这个term出现在field 中的position,以及offset。这些信息可以用来以后高亮一个选中的term等等。
我们可以使用 f.setOmitTermFreqAndPositi ons(true)(Omit是“忽略,跳过”的意思 ) 高数indexWriter不用存储term的count和position等信息。减少磁盘空间。
Records the unique terms that occurred, and their counts,in each document, but doesn’t store any positions or offsets information
Records the unique terms and their counts,and also the positions of each occurrence of every term, but no offsets
Records the unique terms and their counts, with the offsets (start and end character position) of each occurrence of every term,but no positions
Stores unique terms and their counts,along with positions and offsets
Doesn’t store any term vector information
用Field.Store.YES,Field.Store.NO来高数indexWriter 是否存储这个Field 的value。比如很长的文章,就不必存放了,如果title这个较短的可以存放。以节约空间。当然如果需要存放的话,可以在存放前进行压缩处理,使用Lucene的一个utility class(工具类) org.apache.lucene.document.CompressionTools 。但是这回会消耗磁盘交换空间和cpu资源。
例如一本书有多个author。lucene允许同名的 field。
Document doc = new Document();
for (String author : authors)
{
boosting 的意思是推动,加力的意思,就是给每一个document或者field 一个分数,以区别他们的重要性
boosting 可以在index的时候做也可以在search的时候做。
默认情况下 所有的document都没有boost 或者说他们的boost 系数都是1.0
1、boosting Field
Field class 有一个 setBoost方法可以使用。但是记住在如果修改一个document的boost,需要删除这个docment,再加入一个新的 document或者update一个document。lucene update的基本单位是document。而update是delete和add 的组合。
2、boosting document。
其实就是为document的每一个field设置于document相同的boost值。
当决定要关闭index的norm的时候,必须重建整个index。因为在index merge的时候,如果一个index中有一个document有norm,也会导致merge后的整个index都会含有norm。
document是search和index的基本单位,Field就是存储数据的基本单位。Field 有 name和value还有其他很多的选项,可以控制它的行为。
一、如上一篇所讲的 Field的三种处理
new Field("city", "Den Haag", Field.Store.YES, Field.Index.ANALYZED,TermVector.WITH_POSITIONS);
1、是否index,
用 Field.Index.ANALYZED Field.Index.NO等等来表示
ANALYZED
ANALYZED_NO_NORMS
ANALYZED
ANALYZED
ANALYZED_NO_NORMS
NO
NOT_ANALYZED
3、field的value是否存在index中
二、向量空间模型 (vector space model )与term vector
与《集体智慧编程》中的第二章是一样滴。
可以使用Field的第四个参数控制是否存储termVector。
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)
TermVector.YES
TermVector.WITH_POSITIONS
TermVector.WITH_OFFSETS
TermVector.WITH_POSITIONS_OFFSETS
TermVector.NO
例如:
Field f = new Field("city", "Den Haag", Field.Store.YES, Field.Index.ANALYZED,TermVector.WITH_POSITIONS);
三、是否存储 filed的value
五、处理同名的多field。
doc.add(new Field("author", author,Field.Store.YES, Field.Index.ANALYZED )); }
六、boosting document and field
七、norm
Norm的前世今生
field有一个boost 值。这个值是一个float数。每一个document也有。在index阶段这个boost 的float值会被转化为一个byte存在每一个document每一个field中。当在searching阶段,这些norm都会被读入到内存中来,被转化为原来那个float的boost值。
norm 会被调入内存,所以在search的时候 norm是很吃内存的。
norm需要注意的地方。
可以使用indexReader的 setNorm方法,更改norm。但是不要用的好。这个方法会在lucene4.0废掉,并且没有替代的方法 。如下所示