1. org.apache.lucene.demo.IndexFiles类中,使用递归的方式去索引文件。在构造了一个IndexWriter索引器之后,就可以向索引器中添加Doucument了,执行真正地建立索引的过程。遍历每个目录,因为每个目录中可能还存在目录,进行深度遍历,采用递归技术找到处于叶节点处的文件(普通的具有扩展名的文件,比如my.txt文件),然后调用如下代码中红色部分:
  2.  
  3. static void indexDocs(IndexWriter writer, File file)
  4. throws IOException {
  5. // file可以读取
  6. if (file.canRead()) {
  7. if (file.isDirectory()) { // 如果file是一个目录(该目录下面可能有文件、目录文件、空文件三种情况)
  8. String[] files = file.list(); // 获取file目录下的所有文件(包括目录文件)File对象,放到数组files里
  9. // 如果files!=null
  10. if (files != null) {
  11. for (int i = ; i < files.length; i++) { // 对files数组里面的File对象递归索引,通过广度遍历
  12. indexDocs(writer, new File(file, files[i]));
  13. }
  14. }
  15. } else { // 到达叶节点时,说明是一个File,而不是目录,则建立索引
  16. System.out.println("adding " + file);
  17. try {
  18. writer.addDocument(FileDocument.Document(file));
  19. }
  20. catch (FileNotFoundException fnfe) {
  21. ;
  22. }
  23. }
  24. }
  25. }
  26.  
  27. 上面红色标注的这一句:
  28.  
  29. writer.addDocument(FileDocument.Document(file));
  30.  
  31. 其实做了很多工作。每当递归到叶子节点,获得一个文件,而非目录文件,比如文件myWorld.txt。然后对这个文件进行了复杂的操作:
  32.  
  33. 先根据由myWorld.txt构造的File对象f,通过f获取myWorld.txt的具体信息,比如存储路径、修改时间等等,构造多个Field对象,再由这些不同Field的聚合,构建出一个Document对象,最后把Document对象加入索引器IndexWriter对象中,通过索引器可以对这些聚合的DocumentField中信息进行分词、过滤处理,方便检索。
  34.  
  35. org.apache.lucene.demo.FileDocument类的源代码如下所示:
  36.  
  37. package org.apache.lucene.demo;
  38.  
  39. import java.io.File;
  40. import java.io.FileReader;
  41.  
  42. import org.apache.lucene.document.DateTools;
  43. import org.apache.lucene.document.Document;
  44. import org.apache.lucene.document.Field;
  45.  
  46. public class FileDocument {
  47. public static Document Document(File f)
  48. throws java.io.FileNotFoundException {
  49.  
  50. // 实例化一个Document
  51. Document doc = new Document();
  52. // 根据传进来的File f,构造多个Field对象,然后把他们都添加到Document中
  53.  
  54. // 通过f的所在路径构造一个Field对象,并设定该Field对象的一些属性:
  55. // “path”是构造的Field的名字,通过该名字可以找到该Field
  56. // Field.Store.YES表示存储该Field;Field.Index.UN_TOKENIZED表示不对该Field进行分词,但是对其进行索引,以便检索
  57. doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.UN_TOKENIZED));
  58.  
  59. // 构造一个具有最近修改修改时间信息的Field
  60. doc.add(new Field("modified",
  61. DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE),
  62. Field.Store.YES, Field.Index.UN_TOKENIZED));
  63.  
  64. // 构造一个Field,这个Field可以从一个文件流中读取,必须保证由f所构造的文件流是打开的
  65. doc.add(new Field("contents", new FileReader(f)));
  66. return doc;
  67. }
  68.  
  69. private FileDocument() {}
  70. }
  71.  
  72. 通过上面的代码,可以看出Field是何其的重要,必须把Field完全掌握了。
  73.  
  74. Field类定义了两个很有用的内部静态类:StoreIndex,用它们来设置对Field进行索引时的一些属性。
  75.  
  76. // Store是一个内部类,它是static的,主要为了设置Field的存储属性
  77. public static final class Store extends Parameter implements Serializable {
  78.  
  79. private Store(String name) {
  80. super(name);
  81. }
  82.  
  83. // 在索引中压缩存储Field的值
  84. public static final Store COMPRESS = new Store("COMPRESS");
  85.  
  86. // 在索引中存储Field的值
  87. public static final Store YES = new Store("YES");
  88.  
  89. // 在索引中不存储Field的值
  90. public static final Store NO = new Store("NO");
  91. }
  92.  
  93. //通过Index设置索引方式
  94. public static final class Index extends Parameter implements Serializable {
  95.  
  96. private Index(String name) {
  97. super(name);
  98. }
  99.  
  100. // 不对Field进行索引,所以这个Field就不能被检索到(一般来说,建立索引而使它不被检索,这是没有意义的)
  101. // 如果对该Field还设置了Field.Store为Field.Store.YES或Field.Store.COMPRESS,则可以检索
  102. public static final Index NO = new Index("NO");
  103.  
  104. // 对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)
  105. public static final Index TOKENIZED = new Index("TOKENIZED");
  106.  
  107. // 对Field进行索引,但不对其进行分词
  108. public static final Index UN_TOKENIZED = new Index("UN_TOKENIZED");
  109.  
  110. // 对Field进行索引,但是不使用Analyzer
  111. public static final Index NO_NORMS = new Index("NO_NORMS");
  112.  
  113. }
  114.  
  115. Field类中还有一个内部类,它的声明如下:
  116.  
  117. public static final class TermVector extends Parameter implements Serializable
  118.  
  119. 这是一个与词条有关的类。因为在检索的时候需要指定检索关键字,通过为一个Field添加一个TermVector,就可以在检索中把该Field检索到。它的构造函数:
  120.  
  121. private TermVector(String name) {
  122. super(name);
  123. }
  124.  
  125. 通过指定一个字符串,来构造一个FieldTermVector,指定该Field的对词条的设置方式,如下:
  126.  
  127. // 不存储
  128. public static final TermVector NO = new TermVector("NO");
  129.  
  130. // 为每个Document都存储一个TermVector
  131. public static final TermVector YES = new TermVector("YES");
  132.  
  133. // 存储,同时存储位置信息
  134. public static final TermVector WITH_POSITIONS = new TermVector("WITH_POSITIONS");
  135.  
  136. // 存储,同时存储偏移量信息
  137. public static final TermVector WITH_OFFSETS = new TermVector("WITH_OFFSETS");
  138.  
  139. // 存储,同时存储位置、偏移量信息
  140. public static final TermVector WITH_POSITIONS_OFFSETS = new TermVector("WITH_POSITIONS_OFFSETS");
  141. }
  142.  
  143. 同时,Field的值可以构造成很多类型,Field类中定义了4种:StringReaderbyte[]、TokenStream
  144.  
  145. 然后就是Field对象的构造,应该看它的构造方法,它有7种构造方法:
  146.  
  147. public Field(String name, byte[] value, Store store)
  148. public Field(String name, Reader reader)
  149. public Field(String name, Reader reader, TermVector termVector)
  150. public Field(String name, String value, Store store, Index index)
  151. public Field(String name, String value, Store store, Index index, TermVector termVector)
  152. public Field(String name, TokenStream tokenStream)
  153. public Field(String name, TokenStream tokenStream, TermVector termVector)
  154.  
  155. 还要注意了,通过Field类的声明:
  156.  
  157. public final class Field extends AbstractField implements Fieldable, Serializable
  158.  
  159. 可以看出,应该对它继承的父类AbstractField类有一个了解,下面的是AbstractField类的属性:
  160.  
  161. protected String name = "body";
  162. protected boolean storeTermVector = false;
  163. protected boolean storeOffsetWithTermVector = false;
  164. protected boolean storePositionWithTermVector = false;
  165. protected boolean omitNorms = false;
  166. protected boolean isStored = false;
  167. protected boolean isIndexed = true;
  168. protected boolean isTokenized = true;
  169. protected boolean isBinary = false;
  170. protected boolean isCompressed = false;
  171. protected boolean lazy = false;
  172. protected float boost = 1.0f;
  173. protected Object fieldsData = null;
  174.  
  175. 还有Field实现了Fieldable接口,添加了一些对对应的Document中的Field进行管理判断的方法信息。

转自:http://yingbin920.iteye.com/blog/1554852

Lucene Field的更多相关文章

  1. (三)Lucene——Field域和索引的增删改

          1. Field域 1.1  Field的属性 是否分词(Tokenized) 是:对该field存储的内容进行分词,分词的目的,就是为了索引. 比如:商品名称.商品描述.商品价格 否:不 ...

  2. Lucene——Field.Store(存储域选项)及Field.Index(索引选项)

    Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...

  3. Lucene.net

    模糊查询-〉数据库全文检索-〉Lucene 一元分词(lucene内置) Analyzer analyzer = new CJKAnalyzer(); TokenStream tokenStream ...

  4. Lucene教程具体解释

    (建立索引)] )中生成的索引文件的存放地址.详细步骤简单介绍例如以下: 1.创建Directory对象,索引目录 2.创建IndexSearch对象,建立查询(參数是Directory对象) 3.创 ...

  5. lucene教程【转】【补】

    现实流程 lucene 相关jar包 第一个:Lucene-core-4.0.0.jar, 其中包括了常用的文档,索引,搜索,存储等相关核心代码. 第二个:Lucene-analyzers-commo ...

  6. Solr In Action 笔记(2) 之 评分机制(相似性计算)

    Solr In Action 笔记(2) 之评分机制(相似性计算) 1 简述 我们对搜索引擎进行查询时候,很少会有人进行翻页操作.这就要求我们对索引的内容提取具有高度的匹配性,这就搜索引擎文档的相似性 ...

  7. Solr初步学习

    Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...

  8. 【solr基础教程之二】索引

    一.向Solr提交索引的方式 1.使用post.jar进行索引 (1)创建文档xml文件 <add> <doc> <field name="id"&g ...

  9. solr入门

    Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...

随机推荐

  1. Python Counter()计数工具

    Table of Contents 1. class collections.Counter([iterable-or-mapping]) 1.1. 例子 1.2. 使用实例 2. To Be Con ...

  2. A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 69589   ...

  3. iOS 应用有用户评论功能 因为潜在色情信息被退回解决方案

    应用的每一次退回都是一次很好的学习机会 这次是说我的应用没有对色情的内容进行监管或屏蔽的管理机制 这里我主要是 评论页面 违法 如下 以下提供几种解决方案: 1.按照苹果给的建议  我们添加协议进去 ...

  4. DataGridView 多线程更新 数据 解决卡顿问题

    使用多线程更新DataGridView,防止页面卡顿和卡死的问题 private delegate void UpdateDataGridView(DataTable dt); private voi ...

  5. Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)

    1.Java NIO 由以下几个核心部分组成: Channels(通道) Buffers(缓冲区) Selectors(选择器) 虽然Java NIO 中除此之外还有很多类和组件,Channel,Bu ...

  6. 一次PostgreSql数据迁移,使用nodejs来完成

    2014-02-08 XX开放平台不允许使用站外的服务器了,可是我们的app都在站外,数据库也在站外,全都要求迁移到其云主机上(坑爹啊).我们在其云主机上仅有有限的资源,而且也有在运行中的数据库,要做 ...

  7. 【Android 界面效果30】Android中ImageSwitcher结合Gallery展示SD卡中的资源图片

    本文主要是写关于ImageSwitcher结合Gallery组件如何展示SDCard中的资源图片,相信大家都看过API Demo 中也有关于这个例子的,但API Demo 中的例子是展示工程中Draw ...

  8. 关于Django中的表单验证

    ModelForm 和 普通的Form 都可以做表单验证 对于ModelForm如果只是想验证其中一部分model中的field,可以指定:内部类Meta的fields元素: fields = ('x ...

  9. 安卓Design包之CollapsingToolbarLayout(可折叠的工具栏布局)的简单使用

    转自: CollapsingToolbarLayout的使用 注意:使用前需要添加Design依赖包,使用toolbar时需要隐藏标题头 CollapsingToolbarLayout作用是提供了一个 ...

  10. HTTPS的工作原理

    参考自<图解HTTP> 果壳网http://www.guokr.com/post/114121/ HTTPS的工作原理 增加了一层:HTTPS流程:应用层 HTTP->SSL/TLS ...