1. Lucene简介
Lucece官网:
http://lucene.apache.org/
2. Lucene实现
New maven project ->
Create a simple project ->
Group Id: com.andrew.lucene
Artifact Id: Lucene01
Version: 0.0.1-SNAPSHOT
Packaging: jar
Indexer.java代码
package com.andrew.lucene;
import java.io.File;
import java.io.FileReader;
import java.nio.file.Paths;
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.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
public class Indexer {
private IndexWriter writer; // 写索引实例
// 构造方法 实例化IndexWriter
public Indexer(String indexDir) throws Exception {
Directory dir = FSDirectory.open(Paths.get(indexDir));
Analyzer analyzer = new StandardAnalyzer(); // 标准分词器
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
writer = new IndexWriter(dir, iwc);
}
// 索引指定目录的所有文件
public int index(String dataDir) throws Exception {
File[] files = new File(dataDir).listFiles();
for (File f : files) {
indexFile(f);
}
return writer.numDocs();
}
// 索引指定文件
private void indexFile(File f) throws Exception {
System.out.println("索引文件:" + f.getCanonicalPath());
Document doc = getDocument(f);
writer.addDocument(doc);
}
// 获取文档,文档里再设置每个字段
private Document getDocument(File f) throws Exception {
Document doc = new Document();
doc.add(new TextField("contents", new FileReader(f)));
doc.add(new TextField("fileName", f.getName(), Field.Store.YES));
doc.add(new TextField("fullPath", f.getCanonicalPath(), Field.Store.YES));
return doc;
}
// 关闭写索引
public void close() throws Exception {
writer.close();
}
public static void main(String[] args) {
String indexDir = "E:\\lucene";
String dataDir = "E:\\lucene\\data";
Indexer indexer = null;
int numIndexed = 0;
long start = System.currentTimeMillis();
try {
indexer = new Indexer(indexDir);
numIndexed = indexer.index(dataDir);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
indexer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
long end = System.currentTimeMillis();
System.out.println("索引:" + numIndexed + " 个文件,花费了" + (end - start) + "毫秒");
}
}
执行结果
索引文件:E:\lucene\data\CHANGES.txt
索引文件:E:\lucene\data\JRE_VERSION_MIGRATION.txt
索引文件:E:\lucene\data\LICENSE.txt
索引文件:E:\lucene\data\MIGRATE.txt
索引文件:E:\lucene\data\NOTICE.txt
索引文件:E:\lucene\data\README.txt
索引文件:E:\lucene\data\SYSTEM_REQUIREMENTS.txt
索引:7 个文件,花费了901毫秒
Searcher.java代码
package com.andrew.lucene;
import java.nio.file.Paths;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.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;
public class Searcher {
public static void search(String indexDir, String q) throws Exception {
Directory dir = FSDirectory.open(Paths.get(indexDir));
IndexReader reader = DirectoryReader.open(dir);
IndexSearcher is = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer(); // 标准分词器
QueryParser parser = new QueryParser("contents", analyzer);
Query query = parser.parse(q);
long start = System.currentTimeMillis();
TopDocs hits = is.search(query, 10);
long end = System.currentTimeMillis();
System.out.println("匹配 " + q + ",总共花费" + (end - start) + "毫秒" + "查询到" + hits.totalHits + "个记录");
for (ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = is.doc(scoreDoc.doc);
System.out.println(doc.get("fullPath"));
}
reader.close();
}
public static void main(String[] args) {
String indexDir = "E:\\lucene";
String q = "Zygmunt Saloni";
try {
search(indexDir, q);
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果
匹配 Zygmunt Saloni,总共花费24毫秒查询到1个记录
E:\lucene\data\LICENSE.txt
分享到:
相关推荐
lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式 lucene...
1. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 2. 全文检索的实现:Luene全文索引和数据库索引的比较 3. 中文切分词机制简介:基于词库和自动切分词算法的比较 4. 具体的安装和使用简介:系统结构...
基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 ...
第一节 全文检索系统与Lucene简介··· 3 一、 什么是全文检索与全文检索系统?··· 3 二、 什么是Lucene?··· 4 三、 Lucene的应用、特点及优势··· 4 四、 本文的重点问题与cLucene项目··· 5 第二...
Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索...
1. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 2. 全文检索的实现:Luene全文索引和数据库索引的比较 3. 中文切分词机制简介:基于词库和自动切分词算法的比较 4. 具体的安装和使用简介:系统...
精华版(第3版)》总结搜索引擎相关理论与实际解决方案,并给出了Java实现,其中利用了流行的开源项目Lucene和Solr,而且还包括原创的实现。 《解密搜索引擎技术实战——Lucene&Java;精华版(第3版)》主要包括总体...
Lucene简介Lucene中可搜索的实体都表现为文档(document),它由字段(field)和值(value)组成。每个字段值都由一个或多个可搜索的元素——即词汇(term)——组成。Lucene搜索基于反向索引,其中包含了关于可搜索...
Lucene简介 高性能、可扩展的信息检索工具库 为应用程序添加索引/搜索功能 一个典型的应用: 全文索引/搜索 全文索引/搜索 Lucene索引过程的核心类 IndexWriter :提供对索引的写入操作 Directory:描述了索引存放的...
分析器是Lucence的精华,又分为分词和过滤两部分,而且中文分词更是难点,我的例子里是用从博客园程序中提取出来的Lucene.Net.Analysis.Cn.dll来实现中文分词的,谁有中科院的那套中科院ICTCLAS分词工具的C#版麻烦...
基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史全文检索的实现:Luene全文索引和数据库索引的比较中文切分词机制简介:基于词库和自动切分词算法的比较具体的安装和使用简介:系统结构介绍和演示...
9 3.2.4如何提高程序性能 11 3.2.5网络机器人的代码分析 12 3.3小节 14 第四章 基于lucene的索引与搜索 15 4.1什么是Lucene全文检索 15 4.2 Lucene的原理分析 15 4.2.1全文检索的实现机制 15...
基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 ...
本设计为asp.net+sqlserver+c#源码,都可以运行,可以为您做设计,请看个人简介信息获取更多,资源免费,只希望您给个关注给个赞,后续会上传更多新源码,关注后第一时间会通知到您。感谢!
1、Lucene框架的熟练应用实现类似百度、京东商城等应用的全文检索效果; 1、Solr简介 2、Solr下载安装以及目录结构介绍 3、Solr应用部署至Tomcat服务器 4、Solr后台管理界面介绍 5、通过managed-schema配置Field...