Lucene Field
- org.apache.lucene.demo.IndexFiles类中,使用递归的方式去索引文件。在构造了一个IndexWriter索引器之后,就可以向索引器中添加Doucument了,执行真正地建立索引的过程。遍历每个目录,因为每个目录中可能还存在目录,进行深度遍历,采用递归技术找到处于叶节点处的文件(普通的具有扩展名的文件,比如my.txt文件),然后调用如下代码中红色部分:
- static void indexDocs(IndexWriter writer, File file)
- throws IOException {
- // file可以读取
- if (file.canRead()) {
- if (file.isDirectory()) { // 如果file是一个目录(该目录下面可能有文件、目录文件、空文件三种情况)
- String[] files = file.list(); // 获取file目录下的所有文件(包括目录文件)File对象,放到数组files里
- // 如果files!=null
- if (files != null) {
- for (int i = ; i < files.length; i++) { // 对files数组里面的File对象递归索引,通过广度遍历
- indexDocs(writer, new File(file, files[i]));
- }
- }
- } else { // 到达叶节点时,说明是一个File,而不是目录,则建立索引
- System.out.println("adding " + file);
- try {
- writer.addDocument(FileDocument.Document(file));
- }
- catch (FileNotFoundException fnfe) {
- ;
- }
- }
- }
- }
- 上面红色标注的这一句:
- writer.addDocument(FileDocument.Document(file));
- 其实做了很多工作。每当递归到叶子节点,获得一个文件,而非目录文件,比如文件myWorld.txt。然后对这个文件进行了复杂的操作:
- 先根据由myWorld.txt构造的File对象f,通过f获取myWorld.txt的具体信息,比如存储路径、修改时间等等,构造多个Field对象,再由这些不同Field的聚合,构建出一个Document对象,最后把Document对象加入索引器IndexWriter对象中,通过索引器可以对这些聚合的Document的Field中信息进行分词、过滤处理,方便检索。
- org.apache.lucene.demo.FileDocument类的源代码如下所示:
- package org.apache.lucene.demo;
- import java.io.File;
- import java.io.FileReader;
- import org.apache.lucene.document.DateTools;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.document.Field;
- public class FileDocument {
- public static Document Document(File f)
- throws java.io.FileNotFoundException {
- // 实例化一个Document
- Document doc = new Document();
- // 根据传进来的File f,构造多个Field对象,然后把他们都添加到Document中
- // 通过f的所在路径构造一个Field对象,并设定该Field对象的一些属性:
- // “path”是构造的Field的名字,通过该名字可以找到该Field
- // Field.Store.YES表示存储该Field;Field.Index.UN_TOKENIZED表示不对该Field进行分词,但是对其进行索引,以便检索
- doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.UN_TOKENIZED));
- // 构造一个具有最近修改修改时间信息的Field
- doc.add(new Field("modified",
- DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE),
- Field.Store.YES, Field.Index.UN_TOKENIZED));
- // 构造一个Field,这个Field可以从一个文件流中读取,必须保证由f所构造的文件流是打开的
- doc.add(new Field("contents", new FileReader(f)));
- return doc;
- }
- private FileDocument() {}
- }
- 通过上面的代码,可以看出Field是何其的重要,必须把Field完全掌握了。
- Field类定义了两个很有用的内部静态类:Store和Index,用它们来设置对Field进行索引时的一些属性。
- // Store是一个内部类,它是static的,主要为了设置Field的存储属性
- public static final class Store extends Parameter implements Serializable {
- private Store(String name) {
- super(name);
- }
- // 在索引中压缩存储Field的值
- public static final Store COMPRESS = new Store("COMPRESS");
- // 在索引中存储Field的值
- public static final Store YES = new Store("YES");
- // 在索引中不存储Field的值
- public static final Store NO = new Store("NO");
- }
- //通过Index设置索引方式
- public static final class Index extends Parameter implements Serializable {
- private Index(String name) {
- super(name);
- }
- // 不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的)
- // 如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索
- public static final Index NO = new Index("NO");
- // 对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)
- public static final Index TOKENIZED = new Index("TOKENIZED");
- // 对Field进行索引,但不对其进行分词
- public static final Index UN_TOKENIZED = new Index("UN_TOKENIZED");
- // 对Field进行索引,但是不使用Analyzer
- public static final Index NO_NORMS = new Index("NO_NORMS");
- }
- Field类中还有一个内部类,它的声明如下:
- public static final class TermVector extends Parameter implements Serializable
- 这是一个与词条有关的类。因为在检索的时候需要指定检索关键字,通过为一个Field添加一个TermVector,就可以在检索中把该Field检索到。它的构造函数:
- private TermVector(String name) {
- super(name);
- }
- 通过指定一个字符串,来构造一个Field的TermVector,指定该Field的对词条的设置方式,如下:
- // 不存储
- public static final TermVector NO = new TermVector("NO");
- // 为每个Document都存储一个TermVector
- public static final TermVector YES = new TermVector("YES");
- // 存储,同时存储位置信息
- public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");
- // 存储,同时存储偏移量信息
- public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");
- // 存储,同时存储位置、偏移量信息
- public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");
- }
- 同时,Field的值可以构造成很多类型,Field类中定义了4种:String、Reader、byte[]、TokenStream。
- 然后就是Field对象的构造,应该看它的构造方法,它有7种构造方法:
- public Field(String name, byte[] value, Store store)
- public Field(String name, Reader reader)
- public Field(String name, Reader reader, TermVector termVector)
- public Field(String name, String value, Store store, Index index)
- public Field(String name, String value, Store store, Index index, TermVector termVector)
- public Field(String name, TokenStream tokenStream)
- public Field(String name, TokenStream tokenStream, TermVector termVector)
- 还要注意了,通过Field类的声明:
- public final class Field extends AbstractField implements Fieldable, Serializable
- 可以看出,应该对它继承的父类AbstractField类有一个了解,下面的是AbstractField类的属性:
- protected String name = "body";
- protected boolean storeTermVector = false;
- protected boolean storeOffsetWithTermVector = false;
- protected boolean storePositionWithTermVector = false;
- protected boolean omitNorms = false;
- protected boolean isStored = false;
- protected boolean isIndexed = true;
- protected boolean isTokenized = true;
- protected boolean isBinary = false;
- protected boolean isCompressed = false;
- protected boolean lazy = false;
- protected float boost = 1.0f;
- protected Object fieldsData = null;
- 还有Field实现了Fieldable接口,添加了一些对对应的Document中的Field进行管理判断的方法信息。
转自:http://yingbin920.iteye.com/blog/1554852
Lucene Field的更多相关文章
- (三)Lucene——Field域和索引的增删改
1. Field域 1.1 Field的属性 是否分词(Tokenized) 是:对该field存储的内容进行分词,分词的目的,就是为了索引. 比如:商品名称.商品描述.商品价格 否:不 ...
- Lucene——Field.Store(存储域选项)及Field.Index(索引选项)
Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...
- Lucene.net
模糊查询-〉数据库全文检索-〉Lucene 一元分词(lucene内置) Analyzer analyzer = new CJKAnalyzer(); TokenStream tokenStream ...
- Lucene教程具体解释
(建立索引)] )中生成的索引文件的存放地址.详细步骤简单介绍例如以下: 1.创建Directory对象,索引目录 2.创建IndexSearch对象,建立查询(參数是Directory对象) 3.创 ...
- lucene教程【转】【补】
现实流程 lucene 相关jar包 第一个:Lucene-core-4.0.0.jar, 其中包括了常用的文档,索引,搜索,存储等相关核心代码. 第二个:Lucene-analyzers-commo ...
- Solr In Action 笔记(2) 之 评分机制(相似性计算)
Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 我们对搜索引擎进行查询时候,很少会有人进行翻页操作.这就要求我们对索引的内容提取具有高度的匹配性,这就搜索引擎文档的相似性 ...
- Solr初步学习
Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...
- 【solr基础教程之二】索引
一.向Solr提交索引的方式 1.使用post.jar进行索引 (1)创建文档xml文件 <add> <doc> <field name="id"&g ...
- solr入门
Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...
随机推荐
- Python Counter()计数工具
Table of Contents 1. class collections.Counter([iterable-or-mapping]) 1.1. 例子 1.2. 使用实例 2. To Be Con ...
- A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 69589 ...
- iOS 应用有用户评论功能 因为潜在色情信息被退回解决方案
应用的每一次退回都是一次很好的学习机会 这次是说我的应用没有对色情的内容进行监管或屏蔽的管理机制 这里我主要是 评论页面 违法 如下 以下提供几种解决方案: 1.按照苹果给的建议 我们添加协议进去 ...
- DataGridView 多线程更新 数据 解决卡顿问题
使用多线程更新DataGridView,防止页面卡顿和卡死的问题 private delegate void UpdateDataGridView(DataTable dt); private voi ...
- Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)
1.Java NIO 由以下几个核心部分组成: Channels(通道) Buffers(缓冲区) Selectors(选择器) 虽然Java NIO 中除此之外还有很多类和组件,Channel,Bu ...
- 一次PostgreSql数据迁移,使用nodejs来完成
2014-02-08 XX开放平台不允许使用站外的服务器了,可是我们的app都在站外,数据库也在站外,全都要求迁移到其云主机上(坑爹啊).我们在其云主机上仅有有限的资源,而且也有在运行中的数据库,要做 ...
- 【Android 界面效果30】Android中ImageSwitcher结合Gallery展示SD卡中的资源图片
本文主要是写关于ImageSwitcher结合Gallery组件如何展示SDCard中的资源图片,相信大家都看过API Demo 中也有关于这个例子的,但API Demo 中的例子是展示工程中Draw ...
- 关于Django中的表单验证
ModelForm 和 普通的Form 都可以做表单验证 对于ModelForm如果只是想验证其中一部分model中的field,可以指定:内部类Meta的fields元素: fields = ('x ...
- 安卓Design包之CollapsingToolbarLayout(可折叠的工具栏布局)的简单使用
转自: CollapsingToolbarLayout的使用 注意:使用前需要添加Design依赖包,使用toolbar时需要隐藏标题头 CollapsingToolbarLayout作用是提供了一个 ...
- HTTPS的工作原理
参考自<图解HTTP> 果壳网http://www.guokr.com/post/114121/ HTTPS的工作原理 增加了一层:HTTPS流程:应用层 HTTP->SSL/TLS ...