《Lucene in Action》(第二版) 第二章节的学习总结 ---- IndexWriter+Document+Field

这一章节的学习,主要是学会如何创建索引,使用索引

一.创建索引

1.从原始文件中提取内容。这里的文件,可以是文本文件,也可以是二进制文件。文本文件(txt),lucene可以直接处理;而二进制文件(word,pdf等),则可以使用Tika框架(Tika是啥,我自己还没学到,先不细说了)。提取的内容,必须的转换成lucene能识别的格式并存储。这里的格式,就是Field以及由多个Field组成的Document。存储在Directory对象中。

2.光转换成Document还不能用,lucene还得对Document进行分析,转换成语汇单元。分析是使用的分析器,即各种Analyzer

3.Lucene是安装倒排索引的方式来存储分析结果(即语汇单元)的。倒排就是:给定一个语汇单元作为key,哪些document含有这个key啊?

4.建立的索引,存储在一些有奇怪后缀名的文件中(包括:fdt,fdx,fnm,frq,nrm,prx,tii,tis,tvd,tvf,tvx,segments.gen,segments_一个数字,等等),具体含义看附录B吧。这也就是书上说的索引段

二.使用索引

1.向索引中加入文档:

创建IndexWriter对象:IndexWriter writer = new IndexWriter(一个Directory对象,一个分析器对象,一个指定索引存储Field最大所需内存大小的值)

创建Document对象,并加入Field:Document doc = new Document();   doc.add(new Field(域名,域值,域存储选项,域索引选项))

向索引中加入文档:writer.addDocument(doc);    最后记得要writer.close();从而才能将索引的变化提交到Directory对象中。

2.删除索引中的文档:

注意:这里删除的是文档(即Document),而不是Field。也就是说,删除的最小单位是Document。而定位要删除哪个Document,可以使用Term对象或者Query对象。然后使用writer.deleteDocuments(Term对象或者Query对象) 即可

要使得其生效,得writer.commit()或者writer.close();

3.更新索引中的文档

lucene的更新,实际就是先删除旧的Document,再添加新的Document。对应方法是:updateDocument(用来匹配旧文档的Term对象,要更新的新文档对象,可选的一个分析器对象)。

4.索引中的文档里面的域,受到域选项的控制。包括:域索引选项,域存储选项,域的项向量选项(这个不大理解,先写在这里而已);同一个域名还能带多个域值

5.由于索引中会有很多文档,一个文档中又有很多域。那么,哪些文档重要,哪些域重要,就可以用加权来进行控制。有文档加权(doc.setBoost(权值))和域加权(field.setboost(权值))。当加权一个文档时,则文档中所有域也就跟着加权了。

这里我有一个疑问:如果一个文档的权值是1.5;而又给该文档中的某个field加权为2.0,那么,这个特别的field的权值是1.5还是2.0,还是别的啥?

6.最后在记录一个索引的“并发,线程安全及锁机制”。记住:

A.任意数量的只读属性的IndexReader类都可以同时打开一个索引;

B.对于一个索引来说,一次只能打开一个IndexWriter类。当IndexWriter打开一个索引后,就在该索引所在Directory中存放了一个锁文件(write.lock)。其他writer就不能再打开咯。

此章节还有一些高级话题,我还没理解,就先不写了

posted @ 2014-03-14 22:55  拉古小师傅  阅读(233)  评论(0编辑  收藏  举报