`
jessen163
  • 浏览: 463166 次
  • 性别: Icon_minigender_1
  • 来自: 潘多拉
社区版块
存档分类
最新评论

Lucene

阅读更多
第一部分:Lucene建立索引
Lucene建立索引主要有以下两步:
第一步:建立索引器
第二步:添加索引文件

准备在f盘建立lucene文件夹,然后在lucene下建立文件夹test和index两个文件夹。
在test文件夹下建立如下四个txt文件
a.txt 内容:中华人民共和国
b.txt 内容:人民共和国
c.txt 内容:人民
d.txt 内容:共和国

这四个文件就是我们要建立索引的文件,
Index文件夹作为索引结果输出文件夹

准备工作完成以后,我们开始建立索引。

第一步:建立索引器,如下
IndexWriter writer = new IndexWriter("f:\\lucene\\index",
      new StandardAnalyzer(), true);

第二步:添加索引文件
writer.addDocument(..);
具体完整代码如下:
package com.peng.mylucene;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
public class LuceneIndex {
public static void main(String[] args) {
   try {
    LuceneIndex index = new LuceneIndex();
    Date start = new Date();
    index.writeToIndex();
    Date end = new Date();
    System.out.println("建立索引用时" + (end.getTime() - start.getTime())+" 毫秒");
    index.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
}
//索引器
private IndexWriter writer = null;
public LuceneIndex() {
   try {
    //建立索引器,指定索引存放目录,分析器--new StandardAnalyzer()
    writer = new IndexWriter("f:\\lucene\\index",
      new StandardAnalyzer(), true);
   } catch (Exception e) {
    e.printStackTrace();
   }
}
private Document getDocument(File f) {
   //将要建立索引的文件构造成Document对象,并添加域content
   Document doc = new Document();
   BufferedReader bufReader = null;
   try {
    bufReader = new BufferedReader(new InputStreamReader(
      new FileInputStream(f)));
   } catch (FileNotFoundException e) {
    e.printStackTrace();
   }
   //添加内容
   doc.add(Field.Text("contents", bufReader));
   doc.add(Field.Keyword("path", f.getAbsolutePath()));
   return doc;
}
private void writeToIndex() {
   //将目录f:\\lucene\\test下的文件,先通过getDocument(File)函数,
   //构造成Document, 然后添加到索引器writer
   File folder = new File("f:\\lucene\\test");
   if (folder.isDirectory()) {
    File[] list = folder.listFiles();
    for (File f : list) {
     Document doc = getDocument(f);
     try {
      System.out.println("建立索引:" + f);
      writer.addDocument(doc);
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }
}
private void close() {
   try {//关闭索引器
    writer.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
}
}

最后,执行程序,结果如下:
建立索引:f:\lucene\test\a.txt
建立索引:f:\lucene\test\b.txt
建立索引:f:\lucene\test\c.txt
建立索引:f:\lucene\test\d.txt
建立索引用时63 毫秒
在f:\lucene\index下发现索引结果文件
_4.cfs deletable segments

                                     第二部分:在索引上搜索入门实例
在索引上搜索主要包括几个步骤,使用两个对象—IndexSearcher和Query。
检索步骤:
第一步:创建索引器
searcher = new IndexSearcher(IndexReader.open("f:\\lucene\\index"));
第二步:将待检索关键字打包成Query对象
query = QueryParser.parse(key, "contents", new StandardAnalyzer());
第三步:使用索引器检索Query,得到检索结果Hits对象
Hits hit = searcher.search(query);
最后,将检索到的结果Hits打印出来:
for (int i = 0; i < h.length(); ++i) {
   Document doc = h.doc(i);
   System.out.println("这是第 " + i + " 个检索到的结果,文件名为:"
        + doc.get("path"));
}

全部程序如下:
package com.peng.mylucene;
import java.io.IOException;
import java.util.Date;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
public class LuceneSearch {
public static void main(String[] args) {
   LuceneSearch test = new LuceneSearch();
   Hits hit = null;// new Hits();
   hit = test.search("中华");
   test.dispalyResult(hit);
   hit = test.search("人民");
   test.dispalyResult(hit);
   hit = test.search("共和国");
   test.dispalyResult(hit);
}
public LuceneSearch() {
   try {// IndexReader.open()指名索引所在文件夹
    searcher = new IndexSearcher(IndexReader.open("f:\\lucene\\index"));
   } catch (IOException e) {
    e.printStackTrace();
   }
}
// 声明IndexSearcher对象
private IndexSearcher searcher = null;
// 声明Query对象
private Query query = null;
public Hits search(String key) {
   System.out.println("正在检索关键字:" + key);
   try {// 将关键字包装为Query对象
    query = QueryParser.parse(key, "contents", new StandardAnalyzer());
    Date start = new Date();
    Hits hit = searcher.search(query);
    Date end = new Date();
    System.out.println("检索完成,用时:" + (end.getTime() - start.getTime())
      + " 毫秒");
    return hit;
   } catch (Exception e) {
    e.printStackTrace();
   }
   return null;
}
public void dispalyResult(Hits h) {
   if (h.length() < 1) {
    System.out.println("no result !");
    return;
   } else {
    for (int i = 0; i < h.length(); ++i) {
     try {
      Document doc = h.doc(i);
      System.out.println("这是第 " + i + " 个检索到的结果,文件名为:"
        + doc.get("path"));
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
    System.out.println("----------------------");
   }
}
}

在执行第一部分的程序得到索引后,执行搜索程序LuceneSearch,在控制台下得到结果如下:
(对比我们在f:\lucene\test下的四个文件可知,检索结果正确)
正在检索关键字:中华
检索完成,用时:47 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------
正在检索关键字:人民
检索完成,用时:0 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\c.txt
这是第 1 个检索到的结果,文件名为:f:\lucene\test\b.txt
这是第 2 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------
正在检索关键字:共和国
检索完成,用时:0 毫秒
这是第 0 个检索到的结果,文件名为:f:\lucene\test\d.txt
这是第 1 个检索到的结果,文件名为:f:\lucene\test\b.txt
这是第 2 个检索到的结果,文件名为:f:\lucene\test\a.txt
----------------------

总结
通过以上两篇文章我们看以看到使用lucene建立索引过程主要有一下4步:
1.提取文本
2.构建Document
3.分析
4.建立索引





==================================================
Lucene1.4主要提供下列四种不同类型的Field:
Keyword,UnStored,UnIndexed,Text

在Lucene2.0中是通过三个内部类Field.Index,Field.Store,Field.termVector(项向量)的组合来区分Field的具体类型.具体如下:
Field.Store.COMPRESS:压缩保存,用于长文本或二进制数据
Field.Store.YES:保存
Field.Store.NO:不保存

Field.Index.NO:不建立索引
Field.Index.TOKENIZED:分词,建索引
Field.Index.UN_TOKENIZED:不分词,建索引
Field.Index.NO_NORMS:不分词,建索引.但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间

Field.TermVector.NO:不保存term vectors
Field.TermVector.YES:保存term vectors
Field.TermVector.WITH_POSITIONS:保存term vectors.(保存值和token位置信息)
Field.TermVector.WITH_OFFSETS:保存term vectors.(保存值和Token的offset)
Field.TermVector.WITH_POSITIONS_OFFSETS:保存term vectors.(保存值和token位置信息和Token的offset)

而Field的构造函数也用到了这三个内部类:
Field(String, byte[],Field.Store)
Field(String, Reader)
Field(String, Reader, Field.TermVector)
Field(String, String, Field.Store, Field.Index)
Field(String, String, Field.Store, Field.Index, Field.TermVector)

其中Field(String, Reader)和Field(String, Reader, Field.TermVector)默认为Field.Index.TOKENIZED和Field.Store.NO的.我们可以很简单的建立起1.4版本的Field类型和2.0间的转换(这看上去似乎没有什么必要,只是觉得对于理解还是有点帮助的)
Keyword   <==>  Store.YES,Index.UN_TOKENIZED;
UnIndexed <==>  Store.YES,Index.NO;
UnStored  <==>  Store.NO,Index.TOKENIZED;
Text(String, Reader) <==>  Store.NO,Index.TOKENIZED;
Text(String,String)  <==>  Store.YES,Index.TOKENIZED.


Field.Store 表示“是否存储”,即该Field内的信息是否要被原封不动的保存在索引中

Field.Index 表示“是否索引”,即在这个Field中的数据是否在将来检索时需要被用户检索到,一个“不索引”的Field通常仅是提供辅助信息储存的功能。

Field.TermVector 表示“是否切词”,即在这个Field中的数据是否需要被切词。

通常,参数用Reader,表示在文本流数据源中获取数据,数据量一般会比较大。像链接地址URL、文件系统路径信息、时间日期、人名、居民身份证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词,通常用上面的第四个构造函数,第三四个参数分别为Field.Store.YES, Field.Index.YES。
分享到:
评论

相关推荐

    Lucene时间区间搜索

    Lucene是一款强大的全文搜索引擎库,广泛应用于各种数据检索场景。在C#环境下,利用Lucene进行时间区间搜索是提高数据检索效率和精确度的重要手段。本篇将深入探讨如何在C#中实现Lucene的时间区间查询匹配,以及涉及...

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    lucene-4.7.0全套jar包

    【Lucene 4.7.0 全套JAR包详解】 Lucene是一个开源全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高级、灵活的文本搜索API,允许开发者轻松地在应用程序中实现复杂的搜索功能。这次提供的“lucene-...

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    Lucene示例 BM25相似度计算

    在IT领域,搜索引擎技术是至关重要的,而Lucene作为一个开源全文搜索引擎库,广泛应用于各种文本检索系统中。本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、...

    lucene in action 2nd edition, lucene in action 第二版 PDF

    《Lucene in Action 第二版》是一本深入探讨Apache Lucene全文检索库的专业书籍,它在Java开发领域具有很高的权威性。这本书详细介绍了如何利用Lucene进行高效的文本搜索和索引构建,是Java开发者和信息检索爱好者的...

    Lucene与关系型数据库对比

    《Lucene与关系型数据库对比:深度解析与应用探索》 在信息爆炸的时代,数据管理和检索成为了企业乃至个人日常工作中不可或缺的部分。随着技术的发展,不同的数据处理方式应运而生,其中Lucene与关系型数据库作为两...

    计算机专业外文翻译(lucene相关)

    "计算机专业外文翻译(lucene相关)" 本文翻译了论文"Scale-up x Scale-out: A Case Study using Nutch/Lucene",介绍了计算机专业领域中关于Lucene相关的知识点。 Scale-up vs Scale-out 论文中讨论了两个相对...

    lucene-core-7.2.1-API文档-中文版.zip

    赠送jar包:lucene-core-7.2.1.jar; 赠送原API文档:lucene-core-7.2.1-javadoc.jar; 赠送源代码:lucene-core-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.2.1.pom; 包含翻译后的API文档:lucene...

    lucene.NET 中文分词

    **Lucene.NET 中文分词技术详解** Lucene.NET 是一个高性能、全文检索库,它是Apache Lucene项目在.NET平台上的实现。作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档...

    lucene-core-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...

    lucene3源码分析

    ### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...

    lucene所有的jar包

    《全面解析Lucene jar包:从基础到应用》 在信息技术高速发展的今天,搜索引擎已经成为我们获取信息不可或缺的工具。在Java领域,Lucene作为一个强大的全文搜索引擎库,深受开发者喜爱。本文将详细介绍“lucene所有...

    Lucene中的FST算法描述

    在信息检索和存储系统中,Lucene是一个开源的全文搜索引擎库,广泛应用于各种需要全文搜索功能的软件项目中。为了高效地处理和检索存储的词项(term),Lucene使用了FST(有限状态转换器,Finite State Transducer)...

    Lucene 5 主要jar包

    Apache Lucene是一个开源全文搜索引擎库,它为Java开发者提供了强大的文本搜索功能。在这个"Lucene 5 主要jar包"中,我们找到了一系列与Lucene 5.0.0相关的jar文件,这些文件是构建和运行基于Lucene的搜索应用程序的...

    Lucene的原理完整版pdf

    **Lucene原理详解** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单但功能强大的API,用于索引和搜索文本数据,使得开发者可以轻松地在...

    lucene实例lucene实例

    《Lucene实战:深入解析与应用》 Lucene,作为Apache软件基金会的开源全文检索库,是Java领域中广泛使用的搜索引擎框架。它提供了强大的文本分析、索引和搜索功能,被许多大型项目采用,如Elasticsearch、Solr等。...

    基于lucene技术的增量索引

    **基于Lucene技术的增量索引** 在信息技术领域,全文搜索引擎是处理大量数据查询的关键工具。Apache Lucene是一个开源的全文检索库,被广泛应用于构建高效、可扩展的搜索功能。本文将深入探讨如何利用Lucene实现...

    lucene 对 xml建立索引

    ### Lucene对XML文档建立索引的技术解析与实践 #### 一、引言 随着互联网技术的迅猛发展,非结构化数据(如XML文档)在企业和组织中的应用日益广泛。如何高效地处理这些非结构化的数据,特别是进行快速检索成为了一...

Global site tag (gtag.js) - Google Analytics