这一章节的学习,主要是学会如何建立索引,使用索引安全
一.建立索引并发
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就不能再打开咯。
此章节还有一些高级话题,我还没理解,就先不写了