Lucene.net – Index - 1

本文详细解析了Lucene.NET中Field.Store和Field.Index枚举的使用,阐述了为何查询结果仅输出ID,深入探讨了不同存储和索引选项对检索及数据返回的影响。

上一篇,为什么查询结果只输出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,从数据库里取数据,这样两套系统分工就明确了。

转载于:https://www.cnblogs.com/xushuo/archive/2009/08/25/lucene-dot-net-index-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值