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的源码之旅了。
相关推荐
本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记本人的Lucene2.9学习笔记本人的Lucene2.9学习笔记 本人的Lucene2.9学习笔记
lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记
lucene基础学习笔记&源码
lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习lucene学习...
介绍lucene3.5的相关技术,包括基本用法、分析器、索引建立与查询,扩展的高亮、分页、以及solr3.5的相关用法
传智播客Lucene课程课堂笔记
NULL 博文链接:https://lpf.iteye.com/blog/1440160
lucene学习笔记,lucene入门必备材料
NULL 博文链接:https://langxiashahai.iteye.com/blog/703285
Lucene 4 Cookbook is a practical guide that shows you how to build a scalable search engine for your application, from an internal documentation search to a wide-scale web implementation with millions...
主要包含Lucene.net 学习笔记和 Lucene.net 系列的代码,一直一些简单的程序
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是纯java开发的,支持索引的建立和搜索
传智播客lucene课堂笔记,和大家分享下,就是上课的时候记的
NULL 博文链接:https://kylinsoong.iteye.com/blog/719415
Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...