lucene的创建索引

本人用的是lucene3.4,由于刚接触lucene不就,如果有不正当的地方请大家指出。

要想对数据进行检索,首先对数据进行索引,这样当搜索时才能够根据索引找到信息。
Directory directory = FSDirectory.open(new File("d:\\lucene"));
//IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_34, new StandardAnalyzer(Version.LUCENE_34, stopWords)));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_34, new StandardAnalyzer(Version.LUCENE_34));
//最大缓存文档数,控制写入一个新的segment前内存中保存的document的数目
config.setMaxBufferedDocs(100);
//控制一个segment中可以保存的最大document数目,值较大有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。
config.setMaxBufferedDocs(Integer.MAX_VALUE);
IndexWriter indexWriter = new IndexWriter(directory, config);


Document doc = new Document();

//设置Field的name是为了搜索时更精确,比如只想在title中搜索。
Field idField = new Field("id", blog.getId() + "", Field.Store.YES, Field.Index.NO);
Field titleField = new Field("title", blog.getTitle(), Field.Store.YES, Field.Index.ANALYZED);
Field contentField = new Field("content", blog.getContent(), Field.Store.NO, Field.Index.ANALYZED);
Field dateField = new Field("date", blog.getDate(), Field.Store.YES, Field.Index.NO);

doc.add(titleField);
doc.add(contentField);
doc.add(idField);
doc.add(dateField);
//将document加入到indexwriter中以便写入索引文件
indexWriter.addDocument(doc);
//对所有的segment做优化,使所有的segments合并为一个。
indexWriter.optimize();
indexWriter.close();

第一行是在本地磁盘创建一个索引文件所在的位置。FSDirectory是指在硬盘创建索引。
document代表一条记录,比如数据库中的一条记录。一条记录经过索引之后,就是以一个document的形式存储在索引文件中。
Field代表一个信息域,一个document可以包含多个信息域。Field有两个属性可选:存储和索引。Field.Store.NO :不保存到索引中,Field.Store.YES :保存到索引中。Field.Index.ANALYZED :分词,建立索引
这样一条记录索引就创建好了

以下是创建索引的一些API:

[b]IndexWriter[/b]:用于创建和维持一个索引。
其构造函数中的参数”create”用于决定是否创建一个新的索引或者打开一个已经存在的索引。注意:即使有人正在访问一个索引你也可以通过设置create=true来打开一个索引。但先前的访问者只能访问你打开索引这个时间点以前的索引,而不恩那个访问最新的,除非他们再次打开。也有无create参数的构造方法,在这样的构造方法中会判断所设置的路径索引是否已经存在,如果存在则打开,如果不存在则创建。
使用addDocument方法增加document或调用deleteDocuments(Term)/deleteDocuments(Query)删除document,也可以调用updateDocument更新一个document,这个方法是把相应的document删除然后在增加指定的document。当执行完添加、删除或更新操作后应该调用close方法。
以上的方法引起的改变是缓存在内存中的并定期冲刷到目录里(Directory)。当上一次冲刷后所增加的document或所删除的document(setMaxBufferDeleteTerms(int))达到了所设置的缓存则一次新的冲刷被触发。对于添加来说,一次冲刷通过添加document的数量被处罚,或者通过设置RAM使用量(setRAMBufferSizeMB(double))被触发。默认的RAM使用量是16MB,应该设置RAM高点以提高检索速度。注意:冲刷仅仅是把IndexWriter内部的状态传到索引中,但是这些改变对IndexReader是不可见的,除非调用了commit()或close()。也就是说如果添加了一个document但是没有执行close方法,那么通过IndexReader检索时不能检索出刚添加的这个document。当一个或多个segment段合并时,一次冲刷也会被触发,但是是在后台线程执行,以免和addDocument冲突。
如果一次添加的document不多,又希望索引有更高的性能,可以在调用close方法前进行完全优化(optimize)或局部优化optimize(int)。
正在打开着的Indexwriter对索引目录创建了一个锁定文件。那么如果在同一个索引目录打开另一个IndexWriter会抛出LockObtionFailedException。同样的异常也会抛出,如果IndexReader试图在一个已经使用的索引目录中删除document。
IndexWriter是线程安全的,意味着你可以多个线程同时调用自己的方法。

[b]IndexWriterConfig[/b]:存储IndexWriter的配置,应该实例化这个类然后传到IndexWriter内。如果需要事后设置属性可以调用IndexWriter.getConfig();所有设置属性的方法都会返回一个IndexWriterConfig对象,所以可以通过设置链进行多个属性的设置。例如conf.setter1().setter2();

[b]Directory[/b]:是一个文件列表,当文件被创建的时候会被写入到此目录。

[b]Document[/b]是索引或检索的单元。一个Document是一个fields集合。每个field有一个名字和一个文本值。一个field可以通过一个document存储,这时,field通过检索hits中的document返回,这样每个document包含只属于自己的一个或多个field。

[b]Field[/b]:是document的一部分,包括一个name和一个值。值可以是自由文本、字符串、或Reader
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值