Lucene介绍
Lucene总的来说是:
· 一个高效的,可扩展的,全文检索库。
· 全部用Java实现,无须配置。
· 仅支持纯文本文件的索引(Indexing)和搜索(Search)。
· 不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。
在Lucene in action中,Lucene 的构架和过程如下图,
说明Lucene是有索引和搜索的两个过程,包含索引创建,索引,搜索三个要点。
让我们更细一些看Lucene的各组件:
· 被索引的文档用Document对象表示。
· IndexWriter通过函数addDocument将文档添加到索引中,实现创建索引的过程。
· Lucene的索引是应用反向索引。
· 当用户有请求时,Query代表用户的查询语句。
· IndexSearcher通过函数search搜索Lucene Index。
· IndexSearcher计算term weight和score并且将结果返回给用户。
· 返回给用户的文档集合用TopDocsCollector表示。
lucene使用
上面基本上知道了Lucene是一个什么样的东西了,下面我们来看一下如何使用它,我使用的是lucene 4.2.1版本,既然要构建索引,我们肯定需要指定索引目录及被索引的文件目录,使用的如下:
文件名 |
路径 |
内容 |
test1.txt |
D:\code\lucenestudy\source |
I am working in Hangzhou |
test2.txt |
D:\code\lucenestudy\source |
My English is very bad |
test3.txt |
D:\code\lucenestudy\source |
Do you want have a holiday? |
test4.txt |
D:\code\lucenestudy\source |
I am 24 years old |
为了对文档进行索引,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,它表示一个存储在内存当中的索引的位置。熟悉了建立索引所需要的这些类后,我们就开始对某个目录下面的文本文件建立索引了,示例代码如下:
public static void main(String[] args) throws Exception { // 指定索引文件存放目录 File indexDir = new File("D://code//lucenestudy//index"); // 指定被索引文件存放目录 File dataDir = new File("D://code//lucenestudy//source"); //被索引文件目录文件列表 File[] dataFiles = dataDir.listFiles(); Directory dir = FSDirectory.open(indexDir); //新那家一个分词处理器 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_42); //初始化一个indexWriter的配置项 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_42, analyzer); IndexWriter indexWriter = new IndexWriter(dir, iwc); long startTime = new Date().getTime(); for (int i = 0; i < dataFiles.length; i++) { if (dataFiles[i].isFile()) { System.out.println("开始索引文件: " + dataFiles[i].getCanonicalPath()); Document document = new Document(); //添加Field Field pathField = new StringField("path", dataFiles[i].getPath(), Field.Store.YES); document.add(pathField); document.add(new LongField("modified", dataFiles[i].lastModified(), Field.Store.NO)); FileInputStream fis = new FileInputStream(dataFiles[i]); document.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8")))); indexWriter.addDocument(document); } } indexWriter.commit(); indexWriter.close(); long endTime = new Date().getTime(); System.out.println("本次构建索引共花费" + (endTime - startTime) + " s 索引目录为: " + dataDir.getPath()); }
|
利用 Lucene 进行搜索就像建立索引一样也是非常方便的。在上面一部分中,我们已经为一个目录下的文本文档建立好了索引,现在我们就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。Lucene 提供了几个基础的类来完成这个过程,它们分别是 IndexSearcher, QueryParser, Query, TopDocs, Analyzer. 下面我们分别介绍这几个类的功能。
Query
这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。
QueryParser
解析查询query。
TopDocs
TopDocs用来保存搜索到的结果。
IndexSearcher
IndexSearcher是搜索过程中一个核心类,通过query进行查询,并返回搜索到的结果集,它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。示例代码如下:
public static void main(String[] args) throws Exception { //指定索引文件存放目录 String index = "D://code//lucenestudy//index"; String field = "contents"; int hitsPerPage = 10; //搜索关键字 String queryString = "holiday"; //读取索引文件 IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index))); //初始化indexSearcher IndexSearcher searcher = new IndexSearcher(reader); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_42); //初始化query解析器 QueryParser parser = new QueryParser(Version.LUCENE_42, field, analyzer); //解析query Query query = parser.parse(queryString); //搜索 TopDocs resultsDocs = searcher.search(query, 5 * hitsPerPage); System.out.println(resultsDocs.totalHits + " 个匹配文档"); ScoreDoc[] hits = resultsDocs.scoreDocs; for (ScoreDoc scoreDoc : hits) { System.out.println("doc=" + scoreDoc.doc + " score=" + scoreDoc.score); //通过docId得到满足查询条件的document Document doc = searcher.doc(scoreDoc.doc); System.out.println("modified: " + doc.get("modified")); System.out.println("path: " + doc.get("path")); } reader.close(); }
|
综述
让我们再回顾下Lucene API 的调用实现索引和搜索过程:
· 索引过程如下:
· 创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。
· 创建一个Document代表我们要索引的文档。
· 将不同的Field加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。不同类型的信息用不同的Field来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。其中FileReader的SRC_FILE就表示要索引的源文件。
· IndexWriter调用函数addDocument将索引写到索引文件夹中。
· 搜索过程如下:
· IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。
· 创建IndexSearcher准备进行搜索。
· 创建Analyer用来对查询语句进行词法分析和语言处理。
· 创建QueryParser用来对查询语句进行语法分析。
· QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。
· IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopDocs。
以上便是Lucene API函数的简单调用。然而当进入Lucene的源代码后,发现Lucene有很多包,关系错综复杂。了解了Lucene的整个结构,我们便可以开始Lucene的源码之旅了。
相关推荐
【Lucene 3.6 学习笔记】 Lucene 是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发。本文将深入探讨Lucene 3.6版本中的关键概念、功能以及实现方法。 ### 第一章 Lucene 基础 #### 1.1 索引部分的核心...
lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记
### Lucene 3.5 学习笔记 #### 一、Lucene 3.5 基本概念 ##### 1.1 Lucene 概述 **1.1.1 IndexWriter** `IndexWriter` 是 Lucene 中的核心类之一,用于创建或更新索引。它提供了添加文档、删除文档、优化索引等...
《Lucene 3.5 学习笔记》 在信息技术高速发展的今天,搜索引擎技术成为了信息检索的核心工具。Apache Lucene,作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene 3.5版本的相关知识...
《Lucene 3.0 学习笔记(三)与Paoding整合》 在深入了解Lucene 3.0的过程中,我们经常会遇到如何将其与第三方工具进行整合的问题,以提升搜索性能和用户体验。这篇学习笔记主要关注的是将Lucene 3.0与Paoding搜索...
**Lucene 基础学习笔记与源码分析** **一、Lucene 概述** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发并维护。它是一个 Java 开发的开源项目,被广泛应用于各种搜索引擎的构建,支持多种编程...
《深入理解Lucene 2.9.1:构建与搜索的全方位解析》 Lucene,作为一款开源的全文搜索引擎库,被广泛应用于各种信息检索场景。本文将详细讲解Lucene 2.9.1版本的核心概念、架构以及索引创建与搜索的流程。 一、...
传智播客Lucene课程课堂笔记
**Lucene 学习笔记 1** Lucene 是一个全文搜索引擎库,由 Apache 软件基金会开发。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够在其应用程序中集成高级的搜索功能。本篇学习笔记将深入探讨 Lucene 的...
【Lucene学习笔记】 Lucene是一个高性能、全文检索的开源库,完全用Java编写,能够帮助开发者在应用程序中实现复杂的搜索引擎功能。它提供了强大的索引和搜索机制,使得从大量文本数据中快速找到相关信息变得简单。...
标题:Lucene学习笔记 描述:Lucene学习笔记,Lucene入门必备材料 知识点: 一、Lucene概述与文档管理策略 Lucene是一款高性能、全功能的文本搜索引擎库,广泛应用于文档检索、全文搜索等场景。为了提升搜索效率...
**标题:“Lucene5学习之SpellCheck拼写纠错”** 在深入探讨Lucene5的SpellCheck功能之前,首先需要理解Lucene是什么。Lucene是一个开源的全文检索库,由Apache软件基金会开发,它提供了高性能、可扩展的文本搜索...
**Lucene4 全文检索详解** Lucene4 是 Apache 软件基金会的一个开源全文检索库,它为开发者提供了强大的文本搜索功能。作为一个高级的搜索引擎工具包,Lucene4 提供了完整的索引和搜索机制,使得在文件和数据库中...
主要包含Lucene.net 学习笔记和 Lucene.net 系列的代码,一直一些简单的程序
本文将围绕“Lucene5学习之拼音搜索”这一主题,详细介绍其拼音搜索的实现原理和实际应用。 首先,我们需要理解拼音搜索的重要性。在中文环境中,由于汉字的复杂性,用户往往习惯于通过输入词语的拼音来寻找信息。...
lucene学习笔记 1 .txt lucene学习笔记 2.txt lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt Lucene-2.0学习文档 .txt Lucene入门与使用 .txt lucene性能.txt 大富翁全文索引和查询的例子...
本课程由浅入深的介绍了Lucene4的发展历史,开发环境搭建,分析lucene4的中文分词原理,深入讲了lucenne4的系统架构,分析lucene4索引实现原理及性能优化,了解关于lucene4的搜索算法优化及利用java结合lucene4实现...
【Lucene学习笔记】 Lucene 是一款开源的全文检索框架,由Apache软件基金会维护,它提供了高效的、可扩展的搜索引擎功能。不同于一个完整的应用程序,Lucene 提供的是一个基础组件,开发者可以将其集成到自己的应用...
**Lucene 3.3.0 学习Demo** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.3.0版本中,Lucene提供了强大的文本搜索功能,包括分词、索引创建、查询解析和结果排序等。这个"Lucene3.3.0学习Demo...