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

一.创建索引

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就不能再打开咯。

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

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

  1. 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索

    第一章节是介绍性质,但是通过这一章节的学习,我理解到如下概念: 1.Lucene由两部分组成:索引和搜索.索引是通过对原始数据的解析,形成索引的过程:而搜索则是针对用户输入的查找要求,从索引中找到匹配 ...

  2. Netty In Action中国版 - 第二章:第一Netty程序

    本章介绍 获得Netty4最新的版本号 设置执行环境,以构建和执行netty程序 创建一个基于Netty的server和client 拦截和处理异常 编制和执行Nettyserver和client 本 ...

  3. C++学习书籍推荐《C++编程思想第二版第二卷》下载

    百度云及其他网盘下载地址:点我 编辑推荐 “经典原版书库”是响应教育部提出的使用原版国外教材的号召,为国内高校的计算机教学度身订造的.<C++编程思想>(英文版第2版)是书库中的一本,在广 ...

  4. 《大数据技术应用与原理》第二版-第二章大数据处理架构Hadoop

    2.1概述 Hadoop是Apache旗下的开源分布式计算平台,是基于Java开发的,具有很好的跨平台特性,其中核心文件是MapReduce和HDFS,而HDFS是根据谷歌文件系统GFS开源实现,是面 ...

  5. 算法竞赛入门经典第二版第二章习题-(练习Java和C++语法)

    习题2-1水仙花数(daffodil) 输出1000-999中所有的水仙花数.若三位数ABC满足ABC = A3+B3+C3,则称其为水仙花数. Java: package suanfa; publi ...

  6. 《HBase in Action》 第三章节的学习总结 ---- 如何编写和运行基于HBase的MapReduce程序

    HBase之所以与Hadoop是最好的伙伴,我理解就因为两点:1.HADOOP的HDFS,为HBase提供了分布式的存储方式:2.HADOOP的MR为HBase提供的分布式的计算方法.u 其中第一点, ...

  7. Lucene.net站内搜索—6、站内搜索第二版

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  8. Python精要参考(第二版)

    ython 精要参考(第二版) 是Python语言初学者不错的参考学习用书,本系列译自Python Essential Reference, Second Edition 希望本系列可以给python ...

  9. 《Lucene in Action 第二版》第三章节的学习总结----IndexSearcher以及Term和QueryParser

    本章节告诉我们怎么用搜索.通过这章节的学习,虽然搜索的内部原理不清楚,但是至少应该学会简单的编写搜索程序了本章节,需要掌握如下几个主要API1.IndexSearcher类:搜索索引的门户,发起者. ...

随机推荐

  1. Union与UnionAll

    UNION指令的目的是将两个SQL语句的结果合并起来.从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料. UNION的一个限制是两个 ...

  2. Map泛型集合-输入名字输出成绩

    package collection; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import ...

  3. 九. 常用类库、向量与哈希3.Java语言包(java.lang)简介

    Java语言包(java.lang)定义了Java中的大多数基本类,由Java语言自动调用,不需要显示声明.该包中包含了Object类,Object类是整个类层次结构的根结点,同时还定义了基本数据类型 ...

  4. Visual Studio Package扩展——vsct文件简介

    首先我们使用向导生成一个package的扩展,里面就会发现一个vsct文件.vsct文件的全称是Visual Studio Command Table,它其实就是一个xml文件,通过一定的规则来描述v ...

  5. mysql-essential-5.1.55-win32 安装

    1.选择无事物安装 2.my.cnf [mysqld] default-storage-engine=INNODB innodb=on 3.设置数据目录 手动创建目录 D:\data [mysqld] ...

  6. NSPredicate谓词查询

    Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...

  7. kubernetes1.5.2--部署监控服务

    本文基于kubernetes 1.5.2版本编写 Heapster是kubernetes集群监控工具.在1.2的时候,kubernetes的监控需要在node节点上运行cAdvisor作为agent收 ...

  8. UVa221 Urban Elevations

    离散化处理.判断建筑可见性比较麻烦.下面采用离散化解决:把所有的x坐标排序去重,在相邻两个x坐标表示的区间中,整个区间要么同时可见,要么同时不可见.如何判断该区间是否可见?具体做法是选取该区间中点坐标 ...

  9. Shell--命令别名与历史命令

    1.命令别名设置:alias,unalias alias:列出目前系统所有的命令别名 设置命令别名:alias 别名=’命令 参数’ 例如:alias lm=’ls -l | more’ unalia ...

  10. ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介

    现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...