Lucene.net – Index - 1

上一篇,为什么查询结果只输出id呢,那是因为在建索引的时候没有存储其它字段。

注意以下代码:

code
Document doc = new Document();//创建记录对象
doc.Add(new Field("id", sdr["id"].ToString(), Field.Store.YES, Field.Index.NO));//存储,不索引
doc.Add(new Field("title", sdr["title"].ToString(), Field.Store.NO, Field.Index.TOKENIZED));//不存储,分词索引
doc.Add(new Field("content", sdr["content"].ToString(), Field.Store.NO, Field.Index.TOKENIZED));//不存储,分词索引
writer.AddDocument(doc);//加载记录

在构造一个Field对象的时候,最后两个参数,一个是Field.Store枚举,一个是Field.Index枚举,这两个参数比较重要,紧跟在后面的注释也分别对其作了说明。

下面一一说明:

  1. Field.Stroe选项
    1. Field.Stroe.Yes (默认)
    可以用这个字段来检索,并可以返回该字段的内容。
    2. Field.Store.No
    可以用这个字段来检索,但是不能返回该字段的内容,因为该字段的内容没有存储下来。
    3. Field.Store.COMPRESS
    可以用这个字段来检索,并可以返回该字段的内容,但是内容是经过zip压缩的。(这里用到了ICSharpCode.SharpZipLib.dll来实现压缩算法)
  2. Field.Index选项
    1. Field.Index.TOKENIZED
    表示对该字段进行分词。
    2. Field.Index.UN_TOKENIZED
    表示不对该字段进行分词,但是每一条记录(准确的说应该是每一个document)的该字段是一个term(term相当于分完的每一个词,是比feild更加小一个级别的单位)。
    3. Field.Index.NO
    一个term都没有了,这个应该不常用。
    4. Field.Index.NO_NORMS
    效果似乎和Field.Index.UN_TOKENIZED一样,但是它把词条的附加信息全去掉了。比如,它将不再记录词的正太分布数据一类的东西。这样可以减少占用的空间。而且这个用法也有一个条件,就是只要开启,就要全部开启,否则会失效。比如索引了四条数据没使用NO_NORMS,而接下来的两条使用了NO_NORMS,那么前面四条的数据效果,那么接下来的两条数据实际上并没有产生NO_NORMS的效果。

从上面也可以看出,假设Field.Store设置为NO,而Field.Index也设置为NO,那就和没添加是一样的了。Field.Store是给你取完整数据用的,而Field.Index则是给搜索用的。在极端的情况下,可以设置Field.Store为NO,而Field.Index可以搜索,等取数据的时候再从数据源(比如数据库),它们中间有个关联法则,那样可以有效的减轻Lucene的工作压力。这就是为什么只存储id的原因,得到了id,从数据库里取数据,这样两套系统分工就明确了。

posted @ 2009-08-25 23:39  Scott Xu //南方小鬼  阅读(514)  评论(0编辑  收藏  举报