Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统
。
建立索引
为了对文档进行索引,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给出了对某个目录下的文本文件建立索引的源代码:
搜索文档
利用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的实例在一个索引上进行操作。
Hits
Hits是用来保存搜索的结果的。
在系统的D盘的User文件夹里建两个文件夹index,file,file里新建几个文本文件1.txt,2.txt...名字可以随意起,在每个文本里写上一句话保存为utf-8格式
这个特别重要,不然搜索的时候会查找不到结果下面是建立索引的类
package test3;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
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 LuceneIndexTest {
public static void main(String[] args) throws Exception {
// 声明一个对象
LuceneIndexTest indexer = new LuceneIndexTest();
// 建立索引
Date start = new Date();
indexer.writeToIndex();
Date end = new Date();
System.out.println("建立索引用时" + (end.getTime() - start.getTime()) + "毫秒");
indexer.close();
}
public LuceneIndexTest() {
try {
writer = new IndexWriter(Constants.INDEX_STORE_PATH,
new StandardAnalyzer(), true);
} catch (Exception e) {
e.printStackTrace();
}
}
// 索引器
private IndexWriter writer = null;
// 将要建立索引的文件构造成一个Document对象,并添加一个域"content"
private Document getDocument(File f) throws Exception {
Document doc = new Document();
FileInputStream is = new FileInputStream(f);
Reader reader = new BufferedReader(new InputStreamReader(is));
doc.add(Field.Text("contents", reader));
doc.add(Field.Keyword("path", f.getAbsolutePath()));
return doc;
}
public void writeToIndex() throws Exception {
File folder = new File(Constants.INDEX_FILE_PATH);
if (folder.isDirectory()) {
String[] files = folder.list();
for (int i = 0; i < files.length; i++) {
File file = new File(folder, files[i]);
Document doc = getDocument(file);
System.out.println("正在建立索引 : " + file + "");
writer.addDocument(doc);
}
}
}
public void close() throws Exception {
writer.close();
}
}
package test3;
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 LuceneSearchTest {
public static void main(String[] args) throws Exception {
LuceneSearchTest test = new LuceneSearchTest();
Hits h = null;
h = test.search("法院");
test.printResult(h);
h = test.search("学院");
test.printResult(h);
h = test.search("boy");
test.printResult(h);
}
public LuceneSearchTest() {
try {
searcher = new IndexSearcher(IndexReader
.open(Constants.INDEX_STORE_PATH));
} catch (Exception e) {
e.printStackTrace();
}
}
// 声明一个IndexSearcher对象
private IndexSearcher searcher = null;
// 声明一个Query对象
private Query query = null;
public final Hits search(String keyword) {
System.out.println("正在检索关键字 : " + keyword);
try {
// 将关键字包装成Query对象
query = QueryParser.parse(keyword, "contents",
new StandardAnalyzer());
Date start = new Date();
Hits hits = searcher.search(query);
Date end = new Date();
System.out.println("检索完成,用时" + (end.getTime() - start.getTime()) + "毫秒");
return hits;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void printResult(Hits h) {
if (h.length() == 0) {
System.out.println("对不起,没有找到您要的结果。");
}
else
{
for (int i = 0; i < h.length(); i++) {
try {
Document doc = h.doc(i);
System.out.print("这是第" + i + "个检索到的结果,文件名为:");
System.out.println(doc.get("path"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println("--------------------------");
}
}
package test1;
public class Constants {
public final static String INDEX_FILE_PATH = "d:\\Users\\file";
public final static String INDEX_STORE_PATH = "d:\\Users\\index";
}
lucene与数据库的对比
相关推荐
这个“lucene入门小例子”很可能是为了帮助初学者理解并掌握Lucene的基本用法而设计的一系列示例代码。 Lucene的核心概念包括索引、文档、字段和查询。首先,你需要理解索引的概念,它类似于传统数据库中的索引,但...
**Lucene 3.6 入门案例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询、评分等,广泛应用于各种项目和产品中。在这个入门案例中,我们将深入理解如何...
### Lucene 入门基础教程知识点详解 #### 一、Lucene简介 - **定义**:Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成,属于Apache项目的一部分。 - **适用场景**:适合于任何需要进行全文检索的应用...
**标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...
【Lucene入门知识详解】 Lucene是一个基于Java的全文索引引擎工具包,它并不是一个完整的全文搜索引擎,而是提供了一套构建搜索引擎的基础组件。Lucene的主要目标是方便开发者将其集成到各类应用程序中,以实现高效...
总结起来,Lucene入门涉及理解其索引和查询机制,掌握如何在Java项目中创建、管理和使用索引,以及如何执行有效的查询。CargoSearchServiceImpl.java和ManageCargoIndexServiceImpl.java代表了具体实现这些功能的...
本篇文章将深入探讨Lucene-5.2.1的关键知识点,通过实例解析其工作原理和使用方法。 1. **Lucene核心组件** - **Analyzer**:文本分析器是Lucene处理文本的第一步,它负责将输入的字符串分解为一系列的词项...
本篇文章将围绕 Lucene 3.0 版本,详细介绍其入门知识,并通过提供的文档列表,帮助你深入了解并实现简单的搜索功能。 1. **Lucene 3.0 的基础概念** - **索引**:Lucene 的核心是索引,它是一种预处理步骤,将...
**Lucene入门源码解析** Lucene是一款高性能、全文检索库,由Apache软件基金会开发,广泛应用于各种搜索引擎和信息检索系统。它提供了丰富的API,使得开发者可以方便地在应用程序中实现全文检索功能。本篇文章将...
本篇将通过一个简单的入门例子,带你了解如何使用Lucene进行搜索。 首先,我们要知道Lucene的核心组件包括文档(Document)、字段(Field)、索引(Index)和查询(Query)。在Lucene中,信息是以文档的形式存储,...
**Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的...希望这篇简要的介绍能为你开启Lucene5的学习之旅。
本篇文章将深入探讨Lucene的几个常见示例,包括`LuceneDemo`、`LuceneZJ`、`Lucene_HelloWorld`,帮助初学者快速理解Lucene的基本操作。 1. **Lucene_HelloWorld** 这个示例是入门Lucene的首选,它展示了如何创建...
一份适合初学者的Lucene入门指南,可能包含基本的安装步骤、简单的索引和搜索示例,帮助读者快速上手。 8. **lucene性能.txt** 这份文档可能涉及Lucene的性能优化技巧,包括索引存储、内存管理、查询效率等方面的...
博客链接指向了ITEYE上的一篇文章,虽然具体内容未给出,但可以推测作者分享了一个入门级别的教程或代码示例,帮助初学者理解如何在实际项目中使用Lucene。 标签 "源码 工具" 指出我们将关注Lucene的源代码和它作为...
2. **Lucene入门**:解释Lucene的核心概念,如Document、Field、Analyzer和IndexWriter,以及如何建立和管理索引。 3. **Struts与Lucene整合**:演示如何在Struts的Action类中调用Lucene进行搜索,以及如何在JSP页面...
- 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **索引数据术语和约定**:...
这篇博文将带你深入理解Lucene的基本概念和使用方式,帮助你快速入门并掌握其核心功能。 1. **Lucene简介** Lucene是Apache软件基金会的一个开源项目,它提供了高性能、可扩展的信息检索服务。作为一个纯Java库,...
本篇将围绕“Lucene+Nutch搜索引擎开发”这一主题,深入探讨王学松源代码,帮助读者理解并掌握这两项技术的核心概念和应用。 首先,Lucene是一个高性能、全文检索库,它提供了一个简单的API,使得开发者能够方便地...
##### 3.1 第一部分:入门篇 这部分内容旨在帮助读者快速了解 Lucene 的基本概念和工作原理。包括但不限于: - **第 1 章:简介**:介绍 Lucene 的历史和发展现状,解释为什么选择使用 Lucene。 - **第 2 章:快速...