zoukankan      html  css  js  c++  java
  • 《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就不能再打开咯。

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

  • 相关阅读:
    30行代码让你理解angular依赖注入:angular 依赖注入原理
    图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
    HTML5 Application cache初探和企业应用启示
    使用idea的groovy脚本自动创建Jpa的实体
    使用idea的groovy脚本自动创建MybatisPlus的实体
    判断汉字和英文
    PostgreSQL 字符串分隔函数(regexp_split_to_table、regexp_split_to_array)
    golang实现文字云算法
    Java中的String真的无法修改吗
    使用asyncio实现redis客户端
  • 原文地址:https://www.cnblogs.com/lagujw/p/3601357.html
Copyright © 2011-2022 走看看