Boosting Documents and Fields
setBoost(float) 设置Documents和Fields在index中的重要性

可以给document设置boost,也可以给field设置boost
设置boost会删除原来的document然后重新建立索引

doc.setBoost();
field.setBoost();

 

boost是怎样存储到index中的,利用norms
在建立索引过程中生成的boosts会被结合在一起变成一个浮点数,然后每个文档每个字段
都会存为一个byte。在查询过程中,每个field的norms会被装入内存,重新解码为一个浮点数

即使norms在建立索引的过程中得到,我们也可以用IndexReader的setNorm方法来改变

norms会在搜索过程中消耗过多的内存
我们可以将norms关闭,Field.setOmitNorms(true),这样有可能影响评分,但是影响效果
可以忽略

indexing dates&times
DataTools.dateToString(new Date(),DateTools.Resolution.DAY);

Indexing numbers
lucene利用词典编排来给field排序,也就是说如果有3个数:7,71,20,正常的排序是:7,20,71。但是词典排序是:20,7,71。一个简单和通用的方法是给数字加前缀0:007,020,071

indexing fields for sorting

field建立索引但是不分词Field.Index.NOT_ANALYZED,字段必须存储Integers,Floats,Strings

Field truncation
比如说你只想给一个文档前200个字建立索引
在indexWriter的构造方法中传递MaxFieldLength参数
系统设定的值MaxFieldLength.UNLIMITED和MaxFieldLength.LIMITED

可以调用setMaxFieldLength()方法来修改

IndexWriter.setInfoStream(System.out) 关于合并,删除的信息以及当maxFieldLength到达会显示信息

Optimizing an index

索引优化只能提高搜索的速度,不会加快建立索引的速度,不进行优化也有可能获得很好的搜索吞吐量


IndexWriter提供4个优化方法

  • optimize():将index减少到一个segment,只到操作完成才返回
  • optimize(int maxNumSeqments):部分优化,一般来说,index合并到最后一个segment最消耗时间,所以优化到5个segment会比优化到1个segment快
  • optimize(boolean doWait):同optimize()一样,只是当doWait为false的时候,该方法会立刻返回,合并索引操作在后台进行
  • optimize(int maxNumSegments,boolean doWait)