Lucene In Action 第二章 2.4.1 Field options for indexing

不再使用的Field.Index类

该类在Lucene4.x中不再使用。

对应的解决办法:
Index.ANALYZED:将field value分成一个个独立的token,每个token都可以被搜索,如:"java lucene"如果使用StandardAnalyzer会被分解成"java"和"lucene"两个token。在Lucene4.x中可以用如下方法替代:
1、直接创建TextField,如
document.add(new TextField("contents", someText, Store.YES);
2、先创建一个FieldType,通过FieldType指定该field需要的设置,如:

*
                FieldType contentsFieldType = new FieldType();
*                 contentsFieldType.setIndexed( true);
*                 contentFieldType.setTokenized(true);
*                 //...更多设置setXXX()方法
*                 document.add( new Field( "contents", someText, contentsFieldType)); 



Index.NOT_ANALYZED:对field进行索引,但不对String类型的值进行分析,即将整个field value当做一个token,不管有多长,如"阿里巴巴",设置该参数后,"阿里巴巴"将作为一个token。搜索时必须完全匹配"阿里巴巴"才能搜索到。在Lucene4.x中可以用如下方法替代:
1、直接创建StringField,如
document.add(new StringField("company", "阿里巴巴", Store.YES));//可索引可存储
2、先创建一个FieldType,通过FieldType指定该field需要的设置,如:

1.                 FieldType companyFieldTypeType = new FieldType();   
2.                 companyFieldTypeType.setStored( true);      //存储后可以显示给用户看   
3.                 companyFieldTypeType.setIndexed( true);    // 可以索引,即搜索时可以使用这个id来搜索     
4.                 companyFieldTypeType.setTokenized(false);  // 不可分词,即该id的值作为一个整体,不能分割 
5.                 document.add( new Field( "company", "阿里巴巴", idFieldTypeType));



Index.ANALYZED_NO_NORMS:如果设置了这一项,在建索引时,不会为这个field存储norms信息,即不会存储document boost,field boost和lengthNorm(field)的值,lucene用这三个值的积作为norm的值。norm可以用来解决如下问题:
一个长文档,某些词出现的次数可能比在短文档中出现的次数多,但这不足以说明短文档的评分低,在搜索的结果中要排在长文档的后面,使用lengthNorm(field)可以弱化长文档的评分,计算方法是:lengthNorm(field) = (1.0 / Math.sqrt(numTerms)):一个域中包含的Term总数越多,也即文档越长,此值越小,文档越短,此值越大。另外两个document boost 和 field boost用于设置文档的重要性和field的重要性,boost越高越重要。
在Lucene4.x中可以用FieldType类的setOmitNorms(boolean value)方法代替,即将参数设为true即可。这会节省内存,但是降低打分的质量:
FieldType appendixFieldType = new FieldType();
appendixFieldType.setIndexed(true);     //可索引
appendixFieldType.setTokenized(true);   //可分词
appendixFieldType.setOmitNorms(true);   //忽略norms,同时设置这3项即可对应Index.ANALYZED_NO_NORMS

Index.Not_ANALYZED_NO_NORMS:在Lucene4.x中可以用如下方法替代:
appendixFieldType.setIndexed(true);     //可索引
appendixFieldType.setTokenized(false);   //不可分词
appendixFieldType.setOmitNorms(true);   //忽略norms,同时设置这3项即可对应Index.ANALYZED_NO_NORMS

Lucene建立倒排索引后,默认情况下会保存所有必要信息以实施Vector Space Model。该Model需要计算document中出现的所有term出现次数的总和,以及每次出现的位置(这是必要的,如要搜索词组(短语)时就会用到)。但有时候,这些field只是在做纯boolean query搜索时用到,无关评分。比如按照创建的日期范围搜索,只要满足这个日期范围的document都作为结果返回,这与评分无关。在这种情况下,可以通过调用Field.setOmitTermFreqAndPositions(true)方法让Lucene跳过对该field中term的出现频率和位置的索引。该方法可以节省一些索引在磁盘上的存储空间,还可以加速搜索和过滤过程。

按以上说明,个人感觉对应的Lucene4.x的API应该是FieldType类的:
setStoreTermVectorspublic void setStoreTermVectors(boolean value):
Set to true if this field's indexed form should be also stored into term vectors.

setStoreTermVectorOffsetspublic void setStoreTermVectorOffsets(boolean value):
Set to true to also store token character offsets into the term vector for this field.

setStoreTermVectorPositionspublic void setStoreTermVectorPositions(boolean value):
Set to true to also store token positions into the term vector for this field.


如有不对,请指正,谢谢。


猜你喜欢

转载自omglion.iteye.com/blog/2010677