- 浏览: 1251948 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (399)
- 心情故事 (12)
- java (115)
- linux (55)
- 关系型数据库 (35)
- struts,jsf,spring (11)
- jdbc,hibernate,ibatis (11)
- jsp,jstl,c:tag,标签库 (2)
- ejb,webservice (1)
- tomcat,jboss,jetty,weblogic,websphere (15)
- java网络编程 (6)
- java线程 (0)
- js,jquery,json,xml,dom,html.regex (25)
- 设计模式 (6)
- BUG记录 (2)
- ant (2)
- jsp,servlet (4)
- swing (6)
- lucene+nutch (6)
- log4j (2)
- windows doc (2)
- ruby (1)
- ruby on rails (3)
- 操作系统网络 (18)
- apache 错误 (1)
- tomcat (10)
- jboss (9)
- jetty (9)
- weblogic (9)
- websphere (10)
- apache (2)
- AIX的iostat命令查看系统磁盘的使用情况 (1)
- oracle 统计一个表格有多少列 (1)
- Exception in thread "main" java.security.KeyStoreException: Windows-MY not found (1)
- jsp (1)
- jstl (1)
- c:tag (1)
- 标签库 (1)
- struts (1)
- jsf (1)
- spring (2)
- oracle,sqlplus (2)
- sqlplus (2)
- show errors (1)
- proc (1)
- function (1)
- ORA-06544: PL/SQL: internal error (1)
- arguments: [55916] (1)
- [] (7)
- 终端身份实施文档 (1)
- 重装系统之后飞鸽传书只能看到自己 (1)
- vsftp "上传 553 Could not create file" (1)
- startWebLogic.sh启动失败,提示Error initializing Embedded LDAP Server (1)
- java agent 注册为 windows 服务 (1)
- centos (1)
- svn (1)
- apr (1)
- apr-util (1)
- activemq (2)
- oracle (5)
- mysql (3)
- nosql (3)
- NSIS (1)
- windows wmic (1)
- c 指针 (1)
- c c++ (0)
- jmeter (0)
- 性能测试 (0)
- linux,备份 (2)
- C++ ,Virtual (1)
- windows dos (1)
- android (2)
- 大数据,云计算 (1)
- JVM垃圾收集 (1)
- jdbc (2)
- invoke (1)
- hibernate (1)
- ibatis (1)
- 个人开源项目源码收藏 (1)
- 批处理 (1)
- Mongodb mapreduce (8)
- kettle (1)
- Mongodb capped (1)
- mongodb gridfs (1)
- Mongodb 入门基础知识 (1)
- mongodb (8)
- hadoop2.5.1 (1)
- hadoop (4)
- eclipse (1)
- hdfs fs (1)
- elipse hadoop plugin (1)
- PHP相关知识 (1)
- js (1)
- jquery (1)
- json (1)
- xml (1)
- dom (1)
- html.regex (1)
- 网络知识 (1)
- nginx (1)
- docker (1)
- 测试 (1)
- nodejs (1)
- iptables (1)
- linux gitlab (1)
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
web页面调用window.print()函数实现打印的功能 -
hxdtech:
非常感谢!
我在学习ibatis时的培训ppt -
zmwxiaoming:
what 能连数据库不错
SOLR的学习整理 -
springdata_springmvc:
java程序语言学习教程 地址http://www.zuida ...
java获取当前操作系统的信息 -
huanzei:
整理的不错,
oracle lpad函数
1运行环境lucene2.4.1,下载地址:http://apache.etoak.com/lucene/java/lucene-2.4.1.zip
2Lucene 简介 (文档参照http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/ )
Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
3 索引和搜索
索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引(inverted index)的机制。反向索引就是说我们维护了一个词/短语表,对于这个表中的每个词/短语,都有一个链表描述了有哪些文档包含了这个词/短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。我们将在本系列文章的第二部分详细介绍 Lucene 的索引机制,由于 Lucene 提供了简单易用的 API,所以即使读者刚开始对全文本进行索引的机制并不太了解,也可以非常容易的使用 Lucene 对你的文档实现索引。
对文档建立好索引后,就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。
Lucene 软件包的发布形式是一个 JAR 文件,下面我们分析一下这个 JAR 文件里面的主要的 JAVA 包,使读者对之有个初步的了解。
Package: org.apache.lucene.document
这个包提供了一些为封装要索引的文档所需要的类,比如 Document, Field。这样,每一个文档最终被封装成了一个 Document 对象。
Package: org.apache.lucene.analysis
这个包主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。
Package: org.apache.lucene.index
这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类:IndexWriter 和 IndexReader,其中 IndexWriter 是用来创建索引并添加文档到索引中的,IndexReader 是用来删除索引中的文档的。
Package: org.apache.lucene.search
这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。
为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我们分别介绍一下这五个类的用途:
Document
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,清单1给出了对某个目录下的文本文件建立索引的源代码。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
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;
import org.apache.lucene.store.Directory;
public class TxtFileIndexer {
public static void main(String[] args) {
File indexDir=new File("d:\\luceneIndex"); /*要创建的索引文件保存的位置*/
File dataDir=new File("d:\\luceneData"); /*要查询的文档的位置*/
Analyzer luceneAnalyzer =new StandardAnalyzer(); /*改类用来做分词用*/
File[] dataFiles=dataDir.listFiles(); /*获取目录的文档列表*/
Directory directory=null;
try {
// directory = FSDirectory.getDirectory("/tmp/testindex");
IndexWriter iwriter =new IndexWriter (indexDir,luceneAnalyzer,true,IndexWriter.MaxFieldLength.UNLIMITED); /*实例一个索引创建器*/
long startTime = new Date().getTime(); /*当前时间*/
for(int i = 0; i < dataFiles.length; i++){
// if(dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")){
if(dataFiles[i].isFile()){
System.out.println("Indexing file " + dataFiles[i].getCanonicalPath());
Document document = new Document();
Reader txtReader = new FileReader(dataFiles[i]);
document.add(new Field("path",dataFiles[i].getCanonicalPath(),Field.Store.YES, Field.Index.NO)); /*添加path属性*/
document.add(new Field("contents",txtReader)); /*添加contents属性*/
iwriter.addDocument(document); /*加入索引器*/
}
}
iwriter.optimize();
iwriter.close();
long endTime = new Date().getTime(); /*结束时间*/
System.out.println("It takes " + (endTime - startTime)
+ " milliseconds to create index for the files in directory "
+ dataDir.getPath()); /*打印一共用来多少时间*/
} catch (IOException e) {
e.printStackTrace();
}
}
}
重要的API:
IndexWriter
(Directory
d, Analyzer
a, boolean create, IndexDeletionPolicy
deletionPolicy, IndexWriter.MaxFieldLength
mfl)
Expert: constructs an IndexWriter with a custom IndexDeletionPolicy
, for the index in d
. |
IndexWriter
(Directory
d, Analyzer
a, boolean create, IndexWriter.MaxFieldLength
mfl)
Constructs an IndexWriter for the index in d
. |
IndexWriter
(Directory
d, Analyzer
a, IndexDeletionPolicy
deletionPolicy, IndexWriter.MaxFieldLength
mfl)
Expert: constructs an IndexWriter with a custom IndexDeletionPolicy
, for the index in d
, first creating it if it does not already exist. |
void
|
add
(Fieldable
field)
Adds a field to a document. |
Field
(String
name, byte[] value, Field.Store
store)
Create a stored field with binary value. |
Field
(String
name, byte[] value, int offset, int length, Field.Store
store)
Create a stored field with binary value. |
Field
(String
name, Reader
reader)
Create a tokenized and indexed field that is not stored. |
利用Lucene进行搜索就像建立索引一样也是非常方便的。在上面一部分中,我们已经为一个目录下的文本文档建立好了索引,现在我们就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。Lucene提供了几个基础的类来完成这个过程,它们分别是呢IndexSearcher, Term, Query, TermQuery, Hits. 下面我们分别介绍这几个类的功能。
Query
这是一个抽象类,他有多个实现,比如TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。
Term
Term是搜索的基本单位,一个Term对象有两个String类型的域组成。生成一个Term对象可以有如下一条语句来完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。
TermQuery
TermQuery是抽象类Query的一个子类,它同时也是Lucene支持的最为基本的一个查询类。生成一个TermQuery对象由如下语句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”)); 它的构造函数只接受一个参数,那就是一个Term对象。
IndexSearcher
IndexSearcher是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。
package TestLucene;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
/*根据一个或则多个关键字,在多个文件里面查找出现这个关键字的文件*/
public class TxtFileSearcher {
public static void main(String[] args) throws ParseException, IOException {
System.out.println("please input you want search string:");
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(
System.in));
String queryStr = bufferReader.readLine();/*够造输入流*/
if (queryStr == null || "".equals(queryStr)) {
System.out.println("Please input you want search string...");
return;/*没有输入,则返回*/
}
File indexDir = new File("D:\\luceneIndex");/*指定索引目录*/
FSDirectory directory = null;
Searcher searcher = null;
try {
directory = FSDirectory.getDirectory(indexDir);
searcher = new IndexSearcher(directory);/*搜索开始*/
} catch (IOException e) {
e.printStackTrace();
}
if (!indexDir.exists()) {
System.out.println("The Lucene index is not exist");
return;
}
Query query = new QueryParser("contents", getAnalyzer()).parse(queryStr
.trim().toLowerCase());
ScoreDoc[] docs = searcher.search(query, searcher.maxDoc()).scoreDocs;/*得到文档*/
System.out.println(docs.length);
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(
"<strong><font color='red'>", "</font></strong>");
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,
new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(Integer.MAX_VALUE));
/*以上为处理高亮显示*/
for (int i = 0; i < docs.length; i++) {
Document doc = searcher.doc(docs[i].doc);
System.out.println(doc.get("path"));
System.out.println(highlighter.getBestFragment(getAnalyzer(),
"contents", queryStr.trim().toLowerCase()));/*获得高亮显示的内容*/
}
}
public static synchronized Analyzer getAnalyzer() {
return new StandardAnalyzer();
}
}
打印结果如下:
username
4
D:\luceneData\a.txt
<strong><font color='red'>username</font></strong>
D:\luceneData\1.htm
<strong><font color='red'>username</font></strong>
D:\luceneData\2.htm
<strong><font color='red'>username</font></strong>
D:\luceneData\3.htm
<strong><font color='red'>username</font></strong>
到此:这个简单的功能就完成了!我在学这个东西的过程中有一个需求,就是一个比较大的文本文档,我要根据一些关键字来查找,把包含该关键字的那一行或几行作为摘要显示出来!没有实现 ,不知道大家有没有已经实现了的?给点建议或提示!谢谢!
我也是刚接触这个东西!文章里有不对的地方,欢迎指正!
- luceneData.rar (34.8 KB)
- 下载次数: 43
- LuceneStudy.rar (985.9 KB)
- 下载次数: 54
发表评论
-
lucene+nutch学习笔记六:lucene使用需要注意的地方
2009-06-02 15:58 14381尽量减少不必要的存储。 基本的办法是在添加特定的 ... -
lucene+nutch学习笔记五:创建一个简单的索引
2009-06-01 14:15 2021package chapter5; import jav ... -
lucene+nutch学习笔记四:搜索引擎信息索引
2009-06-01 13:55 1849在实际的生活中,Nutch只能从网络上收集网页 , ... -
lucene+nutch学习笔记之二:搜索引擎原理
2009-05-26 13:55 2016整个互联网可以看成是一个蜘蛛网,相互关联,可以感 ... -
lucene+nutch学习笔记一:搜索引擎的一些常识
2009-05-21 10:00 15541常用搜索引擎 搜索引擎是我们现在网 ...
相关推荐
Lucene学习笔记.doc nutch_tutorial.pdf nutch二次开发总结.txt nutch入门.pdf nutch入门学习.pdf Nutch全文搜索学习笔记.doc Yahoo的Hadoop教程.doc [硕士论文]_基于Lucene的Web搜索引擎实现.pdf [硕士论文]_基于...
Nutch 是一个开源的、基于 Lucene 的网络搜索引擎项目,它提供了一套完整的搜索引擎解决方案,包括网页抓取、索引和搜索功能。Nutch 0.8 版本尤其值得关注,因为它完全使用 Hadoop 进行了重写,从而充分利用了 ...
### Nutch全文搜索学习笔记 #### 一、Nutch安装与配置 **1. Linux环境下的JDK安装** 为了能够顺利地安装并运行Nutch,首先确保系统中已安装Java Development Kit (JDK) 并且正确配置了`JAVA_HOME`环境变量。如果...
- **多字段搜索(Multi-field Search)**: 可以在多个字段上同时进行搜索,支持布尔运算符(AND, OR, NOT)和短语查询。 - **模糊搜索(Fuzzy Search)**: 允许用户进行拼写错误的搜索,如Levenshtein距离算法。 -...
这个学习笔记主要涵盖了Lucene的基本概念,包括索引、文档、域和项,以及安装配置和索引的基本过程。 1. **基本概念** - **索引(Index)**:索引是Lucene的核心,它是由一系列文档组成的。每个索引包含了对文档...
### Hadoop数据分析平台学习笔记 #### 一、Hadoop概述 **Hadoop**是一个开源软件框架,用于分布式存储和处理大型数据集。它的设计灵感来源于Google的论文,其中包括Google文件系统(GFS)和MapReduce计算模型。...
【Hadoop学习笔记】 Hadoop 是一个开源框架,主要用于处理和存储大数据。它源自于解决互联网公司面临的海量数据处理问题,特别是Google发布的三篇技术论文,即GFS(Google File System)、MapReduce以及BigTable。...
1. **分布式数据存储**:Hadoop通过其核心组件HDFS(Hadoop Distributed File System)提供分布式存储能力,能够将大量的数据分散存储在多台计算机上,从而实现高可靠性和高性能的数据访问。 2. **分布式计算**:...
在2006年,Cutting加入Yahoo,他的工作进一步发展成为Hadoop,一个包括HDFS(Hadoop Distributed File System)和MapReduce的框架,为大数据处理奠定了基础。同时,Hadoop中的HBase是受到Google BigTable启发的...
Hadoop的三个主要发行版本包括Apache、Cloudera、Hortonworks。Apache版本是最初的开源版本,适用于学习。Cloudera成立于2008年,是最早将Hadoop商用化的公司之一,提供了CDH、Cloudera Manager和Cloudera Support等...