LetsCoding.cn

天地之间有杆秤,拿秤砣砸老百姓。

Lucene源码分析笔记之[org.apache.lucene.document](四)

综述:文档(Document由字段组成(Field),字段由字段名(name)和内容(fieldsDate)组成。

Field类系

1.Field类系层次图
 

2.部分代码及说明

Fieldable接口

Fieldable定义了如下的一系列的方法声明,这些方法在AbstractFieldField中得以实现。

 1void setBoost(float boost); // boost因子
 2float getBoost();
 3String name();    // 字段名
 4public String stringValue();    // 以String的形式字段内容
 5public Reader readerValue();    // 以Reader的形式返回字段内容
 6public byte[] binaryValue();    // 以byte[]的形式返回字段内容
 7public TokenStream tokenStreamValue();    // 以TokenStream的形式返回字段内容
 8boolean isStored();    // 返回该字段是否存储
 9boolean isIndexed();    // 返回该字段是否被索引
10boolean isTokenized();    // 返回该字段是否被分词
11boolean isCompressed();    // 返回该字段是否压缩存储
12boolean isTermVectorStored();    // 用于索引此字段的terms是否以term vector保存
13boolean isStoreOffsetWithTermVector();    // 是否保存该字段term的偏移信息(tvf)
14boolean isStorePositionWithTermVector();    // 是否保存该字段term的位置信息(tvf)
15boolean getOmitNorms();
16void setOmitNorms(boolean omitNorms);
17boolean isLazy();    // 返回该字段内容是否滞后加载


AbstractField

AbstractField为一抽象类,它实现了Fieldable中的部分方法。也定义了一系列变量用来表示该Field所包含的数据及对此数据的处理方式。

 1    protected String name = "body"// Field名,默认为body
 2    protected boolean storeTermVector = false;    // 是否保存字段的term vector
 3    protected boolean storeOffsetWithTermVector = false;    // term偏移信息
 4    protected boolean storePositionWithTermVector = false;    // term位置信息
 5    protected boolean omitNorms = false// 是否省略标准????
 6    protected boolean isStored = false// 是否存储
 7    protected boolean isIndexed = true// 是否索引
 8    protected boolean isTokenized = true// 是否分词
 9    protected boolean isBinary = false;    // 是否二进制保存
10    protected boolean isCompressed = false// 是否压缩存储
11    protected boolean lazy = false// 是否滞后加载
12    protected float boost = 1.0f// boost因子
13    // the one and only data object for all different kind of field values
14    protected Object fieldsData = null// Field内容


Field

Field为具体子类,实现了接口Fieldable中的所有方法。另外,它还定义了3个内部类,Field.Store Field.IndexField.TermVector用来说明在索引是对该字段的处理方式。

Field.Store:是否存储此Field

Field.Index:是否索引此Field

Field.TermVector:此Field是否拥有及如何存储term vectors



FieldSelector
类系

1FieldSelector类系层次图

3.部分代码及说明

FieldSelectoResult接口

FieldSelector接口只提供了一个accept(fieldName)方法,用来返回文档的字段在文档被读取时的载入方式;而FieldSelectorResult则是字段载入方式的集合类:

 1public transient static final FieldSelectorResult LOAD = new FieldSelectorResult(
 2            0);    // 立即载入
 3public transient static final FieldSelectorResult LAZY_LOAD = new FieldSelectorResult(
 4            1);        // 滞后载入
 5public transient static final FieldSelectorResult NO_LOAD = new FieldSelectorResult(
 6            2);        // 不载入字段内容
 7public transient static final FieldSelectorResult LOAD_AND_BREAK = new FieldSelectorResult(
 8            3);        // 载入部分字段并终止载入
 9public transient static final FieldSelectorResult LOAD_FOR_MERGE = new FieldSelectorResult(
10            4);        // 立即载入,但不解压被压缩过的内容
11public transient static final FieldSelectorResult SIZE = new FieldSelectorResult(
12            5);        // 只载入字段大小
13public transient static final FieldSelectorResult SIZE_AND_BREAK = new FieldSelectorResult(
14            6);        // 载入字段大小并立即终止载入
15

 

LoadFirstFieldSelector

LoadFirstFieldSelector最简单的一个FieldSelector实现类,该选择器类说明字段(accept()方法中的参数指定的字段)内容被载入后,立即终止文档的载入过程。

1    public FieldSelectorResult accept(String fieldName) {
2        return FieldSelectorResult.LOAD_AND_BREAK;
3    }

 

MapFieldSelector

MapFieldSelector用来说明哪些字段内容被载入,哪些字段内容不被载入。它定义了一个Map类型的变量:fieldSelections,在此Map查的到的字段将被载入,反之将不被载入。

1    public FieldSelectorResult accept(String field) {
2        FieldSelectorResult selection = (FieldSelectorResult) fieldSelections
3                .get(field);
4        return selection != null ? selection : FieldSelectorResult.NO_LOAD;
5    }


SetBasedFieldSelector类

SetBasedFieldSelector用来说明哪些字段内容将被立即载入,哪些字段将被滞后载入。

 1    private Set fieldsToLoad;    // 立即载入字段集合
 2    private Set lazyFieldsToLoad;    // 滞后载入字段集合
 3
 4    public FieldSelectorResult accept(String fieldName) {
 5        FieldSelectorResult result = FieldSelectorResult.NO_LOAD;
 6        if (fieldsToLoad.contains(fieldName) == true{
 7            result = FieldSelectorResult.LOAD;
 8        }

 9        if (lazyFieldsToLoad.contains(fieldName) == true{
10            result = FieldSelectorResult.LAZY_LOAD;
11        }

12        return result;
13    }

 

Document

文档是索引和搜索的单位,它由一组字段构成。每个字段都有字段名跟字段内容。字段有可能跟文档一起被保存下来,这样在文档被搜索到时就会同时返回该字段的内容。因此,文档需要保存一个或多个字段来与其他文档相区别。

posted on 2008-12-02 12:01 Rolandz 阅读(2342) 评论(3)  编辑  收藏

评论

# re: Lucene源码分析笔记之[org.apache.lucene.document](四) 2009-03-30 14:06 koala++

写的不错呀,为什么不再写下去了呢?  回复  更多评论   

# re: Lucene源码分析笔记之[org.apache.lucene.document](四) 2009-10-21 20:10 ggggggggg

写的非常好,我不顶不行.....  回复  更多评论   

# re: Lucene源码分析笔记之[org.apache.lucene.document](四) 2009-11-11 15:53 afdsafds

是不是延迟加载是不是只能查看不能设置呀?请问有办法设置加载方式吗?  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

留言簿(1)

随笔分类(12)

随笔档案(19)

积分与排名

最新评论

阅读排行榜

评论排行榜