lucene简介
lucene是基于java的开源搜索库。它以基于文档,提供高效和简单的搜索方式而流行。本教程将讲解在复杂的企业级应用中所需要的lucene知识。
lucene查询是如何工作的?
任何的lucene查询都要经历以下一个或几个以下步骤。
步骤 | 标题 | 描述 |
2 | 建立文档 | 建立能够被应用程序识别的文档 |
3 | 分析文档 | 在索引被建立之前,首先需要明确那一部分内容需要被分词器分析。 |
4 | 建立索引 | 文档被分析完后,然后创建索引,这样文档才能被索引映射获取。索引过程就像一本书的目录,能够根据页码去快速索引,而不是一页一页查找。 |
5 | 用户检索接口 | 索引建立完成后,为了方便用户根据文本进行查询,必须提供接口。 |
6 | 创建Query | 用户必须创建一个Query对象,以便于作为参数查询相关联的信息。 |
7 | 搜索Query | 根据Query对象,找到文档中的内容和相关联信息。 |
8 | 渲染结果 | 当查询出结果集后,就必须考虑如何组装它,让用户第一眼看到有用的信息。 |
除了以上部分,应用程序还可以提供管理页面为管理员根据用户配置文件进行搜索控制。检索结果是评论一个应用程序先进性的一个重要指标。
lucene在应用系统中所当任的角色
lucene在应用系统中一般做上面2-7步骤所需要做的操作。lucene封装了有关索引和搜索的核心操作。具体查询和结果集封装是应用程序来承担。下面看一个用Lucene检索图书馆图书的例子。
Lucene-第一个应用
我们以一个实际的例子来体验一下lucene框架。我们写一个简单的应用程序,打印出我们检索出来的条数,并且查看在这一过程中索引的创建。
1、创建一个java应用程序。
打开Eclipse IDE,依次打开 File -> New -> Project。最后选择Java Project。工程名字输入 LuceneFirstApplication,直接到最后finish。这样我们就创建了一个java工程。
2、添加依赖包
右键你的工程,Build Path -> Configure Build Path 在打开的面板里面增加lucene-core-3.6.2.
3、创建文件
右键点击工程 src目录,New -> Package增加包com.tutorialspoint.lucene。在包下面创建文件LuceneTester.java和其他一些文件
LuceneConstants.java 常量类
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS="contents";
public static final String FILE_NAME="filename";
public static final String FILE_PATH="filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java 用来过滤.txt文件
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Indexer.java 通过此类我们能够使用lucene库搜索源数据
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException{
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws CorruptIndexException, IOException{
writer.close();
}
private Document getDocument(File file) throws IOException{
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS, new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME, file.getName(), Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH, file.getCanonicalPath(), Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
private void indexFile(File file) throws IOException{
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
public int createIndex(String dataDirPath, FileFilter filter) throws IOException{
//get all files in the data directory
File[] files = new File(dataDirPath).listFiles();
for (File file : files) {
if(!file.isDirectory()
&& !file.isHidden()
&& file.exists()
&& file.canRead()
&& filter.accept(file)
){
indexFile(file);
}
}
return writer.numDocs();
}
}
Searcher.java 这个类是用来查询 Indexer所创建的索引内容
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
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.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath)
throws IOException{
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException{
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException{
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException{
indexSearcher.close();
}
}
LuceneTester.java 这个类是用来测试Lucene库的索引和搜索功能。
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.createIndex();
tester.search("Mohan");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void createIndex() throws IOException{
indexer = new Indexer(indexDir);
int numIndexed;
long startTime = System.currentTimeMillis();
numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
long endTime = System.currentTimeMillis();
indexer.close();
System.out.println(numIndexed+" File indexed, time taken: "
+(endTime-startTime)+" ms");
}
private void search(String searchQuery) throws IOException, ParseException{
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
TopDocs hits = searcher.search(searchQuery);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime));
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.println("File: "
+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
4、数据文件和索引目录创建
我们创建2个文件夹, E:\Lucene\Data和E:\Lucene\Index。第一个是用来存放我们要检索的数据,第二个是用来作为索引的存放目录。在E:\Lucene\Data里面我们创建10个文件,文件名分别为record1.txt到record10.txt。在text里面我们存放了学生的名称和其他基本资料。
5、运行程序
可以用 Run或者Ctrl + F11运行LuceneTester。在控制台将打印以下内容
Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
1 documents found. Time :0
File: E:\Lucene\Data\record4.txt
在index文件夹中将存在一下文件
lucene-索引类
索引过程是由Lucene的所提供的核心功能之一。下图说明了索引过程和使用的类。IndexWriter是索引过程中最重要的和核心组件。
我们将使用特定的分析器分析包含索引域的文档他,添加到IndexWriter中,然后创建”创建/打开/编辑“所需的索引存储或者更新到目录下。IndexWriter用于更新或创建索引。它不是用来读取索引。
以下是索引过程要用到的常用类。
序号 | 类或者描述 |
1、IndexWriter | 此类是索引过程中创建和更新组件的核心类 |
2、Directory此类表示索引的存储位置 |
3、Analyzer | 分析器类负责分析一个文档,获取文本的词和标记(tockens?)。IndexWriter创建索引必须在分析之后。 |
4、Document | 文档对象是包含索引域的虚拟文档,索引域中可以包含文档的物理存储内容,元数据等。分析器只能够分析文档对象。 |
5、Field | 索引域是可以被索引的最小单元,或者是一个索引的起点。它包含一个key,value键值对。lunece只能够索引文本或者数字内容。 |
Note:剩下的明天继续
- 大小: 146.4 KB
- 大小: 83.9 KB
分享到:
相关推荐
标题中的“vb.net2.0_Lucene_test.rar_lucene_lucene vb.n_lucene.net vb”表明这是一个关于使用VB.NET 2.0版本实现Lucene搜索引擎的测试项目。Lucene是一个高性能、全文本搜索库,广泛应用于Java开发,而这里则是将...
【标题】"java+lucene)1236.rar_Lucene 搜索_Luncene_lucene_lucene web" 提供的信息表明这是一个使用Java和Lucene框架实现的搜索系统,特别是针对公交数据的搜索。Lucene是Apache软件基金会的一个开源全文检索库,...
lucene_in_action中文版lucene_in_action中文版lucene_in_action中文版lucene_in_action中文版lucene_in_action中文版lucene_in_action中文版
Lucene_CN.jar,这个名字或许对许多开发者来说并不陌生,它是一个专为中文语言处理而设计的分析器,是Apache Lucene项目的一部分。这篇文章将深入探讨Lucene_CN.jar的功能、作用以及其内部结构,旨在帮助开发者更好...
在"ssd.rar_lucene_搜索 lucene_搜索引擎_文本搜索"这个项目中,我们看到的是一个利用Lucene实现的桌面搜索引擎实例。 **文本搜索的基本原理** 文本搜索的核心在于将非结构化的文本数据转换成结构化的索引形式,...
标题"Lucene资料大全(包括Lucene_in_Action书等)"表明这是一个包含全面Lucene学习资源的集合,其中最显著的是《Lucene_in_Action》这本书。这是一本广泛认可的关于Apache Lucene的权威指南,通常被简称为LIA,它深入...
在“chinese_lucene.rar”压缩包中,除了上述的分词库和Lucene.Net之外,还可能包含示例代码、文档资料等,帮助开发者快速理解和上手。这些资源对于初学者和有经验的开发者都极具价值,不仅可以学习如何在C#环境下...
本文将深入探讨一个名为“lucene_web”的项目,它是基于Lucene实现的一个Web应用程序实例,旨在帮助开发者更好地理解和运用Lucene进行Web开发。 首先,我们要明白Lucene的核心功能。Lucene提供了一套完整的搜索索引...
这个"lucene_jar包"包含了Lucene的核心组件,是开发者构建搜索功能的基础。在Java开发环境中,jar(Java Archive)包是将多个类文件打包在一起的格式,方便在不同项目中复用和部署。 **1. Lucene简介** Lucene最初...
核心 Lucene3.6_api.chm 放心下载
这个名为“lucenevideao(eddy).rar_Lucene.net a_eddy_lucene_lucene web_luce”的资源,包含了一份由Eddy精心制作的Lucene.NET视频教程,以及相关的学习材料,是深入理解和应用Lucene.NET的好帮手。 首先,视频...
Lucene_in_Action english版
通过深入理解《JAVA_Lucene_in_Action》教程的核心内容和应用案例,我们可以看到Lucene不仅是一款功能强大的搜索工具,更是一个充满活力的开源社区。无论是初学者还是经验丰富的开发者,都能从中获益匪浅。随着技术...
Lucene_in_ Action java search engine.PDF 搜索引擎教程
本文将深入探讨这两个工具,尤其是关于"compass_lucene_source"这个主题,它可能指的是Compass库中的Lucene源代码或与之相关的项目。 首先,让我们了解Compass。Compass是一个基于Apache Lucene的全文搜索引擎框架...
标题 "PE1_lucene_" 暗示我们关注的是与Lucene相关的编程代码或解决方案,可能是一个关于如何使用Apache Lucene进行信息检索或全文搜索的项目。Lucene是Java开发的开源全文搜索引擎库,它提供了高级文本分析和索引...