lucene搜索小例子
2013-03-11 17:13
295 查看
首先在你的c盘建立一个test文件加,里面放入四个.txt文件 其中a.txt输入“中华人民共和国” b.txt输入“人民共和国” c.txt输入“人民” d.txt输入“共和国”。c盘下在建立一个index文件,只是作为索引存放目录的。
然后在eclipse中新建一个java项目,输入项目名称LuceneHelloWord,然后点击下一步,找到“库”然后“添加外部jar ”,把你的lucene包添加进去就可以了,我的是lucene-core-2.0.0.jar。
在项目中建三个类,Constants.java是用来存储一些常量的类,如索引文件的路径和索引文件的存放位置
代码
package testlucene;
public class Constants {
// 要索引的文件的存放路径
public final static String INDEX_FILE_PATH = "c:/test";
// 索引的存放位置
public final static String INDEX_STORE_PATH = "c:/index";
}
LuceneIndex.java是用来对文件建立索引的类。代码
package testlucene;
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.index.IndexWriter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
public class LuceneIndex {
public static void main(String[] args) throws Exception {
// 声明一个对象
LuceneIndex indexer = new LuceneIndex();
// 建立索引
Date start = new Date();
indexer.writeToIndex();
Date end = new Date();
System.out
.println("建立索引时用:" + (end.getTime() - start.getTime()) + "毫秒");
// 关闭索引器
indexer.close();
}
public LuceneIndex() {
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(new Field("contents", reader));
doc.add(new Field("path", f.getCanonicalPath(), Field.Store.YES,
Field.Index.NO));
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();
}
}
luceenSearch.java适用于检索索引的类。代码:
package testlucene;
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 LuceneSearch {
public static void main(String args[])throws Exception{
LuceneSearch test = new LuceneSearch();
//检索“人民”这个关键词
Hits h = null;
h = test.search("华人");
test.printResult(h);
h = test.search("共和");
test.printResult(h);
h = test.search("人");
test.printResult(h);
}
public LuceneSearch(){
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 = new QueryParser("contents",new StandardAnalyzer()).parse(keyword);
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("-------------------------------");
}
}
在LuceneIndex.java中,
doc.add(new Field("contents", reader));
doc.add(new Field("path", f.getCanonicalPath(), Field.Store.YES,
Field.Index.NO));
这段代码在lucene1.4中是
doc.add(Field.Text("contents",reader));
doc.add(Field.keyword("path", f.getSbsolutePath()));
是因为lucene2.0相对于1.4版来说,Field类变化较大,在lucene1.4中分为四种:Keyword、Noindexed、Nostoreed和Text,而在lucene2.0中分为了Index、Store和TermVector三大类,每个大类下还分几个小类。
我对于Field的几个分类没有理解清楚(API都是英文的很难看懂)。
在luceenSearch.java中的代码
query = new QueryParser("contents",new StandardAnalyzer()).parse(keyword);
在lucene1.4中是
query = QueryParser.parse(keyword,"contents",new StandardAnalyzer());
运行LuceneIndex.java(点击运行方式,运行java应用程序)可看到如下结果:
正在建立索引c:/test/a.txt
正在建立索引c:/test/b.txt
正在建立索引c:/test/c.txt
正在建立索引c:/test/d.txt
建立索引时用:63毫秒
运行luceenSearch.java(点击运行方式,运行java应用程序)可看到如下结果:
正在检索关键字:华人
检索完成,用时:31毫秒
这是第0个检索到的结果,文件名为:C:/test/a.txt
-------------------------------
正在检索关键字:共和
检索完成,用时:0毫秒
这是第0个检索到的结果,文件名为:C:/test/d.txt
这是第1个检索到的结果,文件名为:C:/test/b.txt
这是第2个检索到的结果,文件名为:C:/test/a.txt
-------------------------------
正在检索关键字:人
检索完成,用时:0毫秒
这是第0个检索到的结果,文件名为:C:/test/c.txt
这是第1个检索到的结果,文件名为:C:/test/b.txt
这是第2个检索到的结果,文件名为:C:/test/a.txt
-------------------------------
附lucene下载地址:
lucene下载地址http://www.apache.org/dyn/closer.cgi/jakarta/lucene
或者直接点这个ftp ftp://apache.mirrors.pair.com/jakarta/lucene 都可以
然后在eclipse中新建一个java项目,输入项目名称LuceneHelloWord,然后点击下一步,找到“库”然后“添加外部jar ”,把你的lucene包添加进去就可以了,我的是lucene-core-2.0.0.jar。
在项目中建三个类,Constants.java是用来存储一些常量的类,如索引文件的路径和索引文件的存放位置
代码
package testlucene;
public class Constants {
// 要索引的文件的存放路径
public final static String INDEX_FILE_PATH = "c:/test";
// 索引的存放位置
public final static String INDEX_STORE_PATH = "c:/index";
}
LuceneIndex.java是用来对文件建立索引的类。代码
package testlucene;
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.index.IndexWriter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
public class LuceneIndex {
public static void main(String[] args) throws Exception {
// 声明一个对象
LuceneIndex indexer = new LuceneIndex();
// 建立索引
Date start = new Date();
indexer.writeToIndex();
Date end = new Date();
System.out
.println("建立索引时用:" + (end.getTime() - start.getTime()) + "毫秒");
// 关闭索引器
indexer.close();
}
public LuceneIndex() {
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(new Field("contents", reader));
doc.add(new Field("path", f.getCanonicalPath(), Field.Store.YES,
Field.Index.NO));
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();
}
}
luceenSearch.java适用于检索索引的类。代码:
package testlucene;
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 LuceneSearch {
public static void main(String args[])throws Exception{
LuceneSearch test = new LuceneSearch();
//检索“人民”这个关键词
Hits h = null;
h = test.search("华人");
test.printResult(h);
h = test.search("共和");
test.printResult(h);
h = test.search("人");
test.printResult(h);
}
public LuceneSearch(){
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 = new QueryParser("contents",new StandardAnalyzer()).parse(keyword);
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("-------------------------------");
}
}
在LuceneIndex.java中,
doc.add(new Field("contents", reader));
doc.add(new Field("path", f.getCanonicalPath(), Field.Store.YES,
Field.Index.NO));
这段代码在lucene1.4中是
doc.add(Field.Text("contents",reader));
doc.add(Field.keyword("path", f.getSbsolutePath()));
是因为lucene2.0相对于1.4版来说,Field类变化较大,在lucene1.4中分为四种:Keyword、Noindexed、Nostoreed和Text,而在lucene2.0中分为了Index、Store和TermVector三大类,每个大类下还分几个小类。
我对于Field的几个分类没有理解清楚(API都是英文的很难看懂)。
在luceenSearch.java中的代码
query = new QueryParser("contents",new StandardAnalyzer()).parse(keyword);
在lucene1.4中是
query = QueryParser.parse(keyword,"contents",new StandardAnalyzer());
运行LuceneIndex.java(点击运行方式,运行java应用程序)可看到如下结果:
正在建立索引c:/test/a.txt
正在建立索引c:/test/b.txt
正在建立索引c:/test/c.txt
正在建立索引c:/test/d.txt
建立索引时用:63毫秒
运行luceenSearch.java(点击运行方式,运行java应用程序)可看到如下结果:
正在检索关键字:华人
检索完成,用时:31毫秒
这是第0个检索到的结果,文件名为:C:/test/a.txt
-------------------------------
正在检索关键字:共和
检索完成,用时:0毫秒
这是第0个检索到的结果,文件名为:C:/test/d.txt
这是第1个检索到的结果,文件名为:C:/test/b.txt
这是第2个检索到的结果,文件名为:C:/test/a.txt
-------------------------------
正在检索关键字:人
检索完成,用时:0毫秒
这是第0个检索到的结果,文件名为:C:/test/c.txt
这是第1个检索到的结果,文件名为:C:/test/b.txt
这是第2个检索到的结果,文件名为:C:/test/a.txt
-------------------------------
附lucene下载地址:
lucene下载地址http://www.apache.org/dyn/closer.cgi/jakarta/lucene
或者直接点这个ftp ftp://apache.mirrors.pair.com/jakarta/lucene 都可以
lucene-core-2.0.0.jar是需要用到的文件,lucene-2.0.0-src.zip或者lucene-2.0.0.zip压缩包都可以,还可以直接下载jar文件
相关文章推荐
- lucene多种搜索方式详解例子
- lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)
- lucene笔记(搜索的小例子)
- Lucene 生成索引以及搜索的完整例子
- lucene多种搜索方式详解例子
- lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)
- lucene4.6索引创建和搜索例子
- Lucene各种搜索例子
- lucene.net helper类 【结合盘古分词进行搜索的小例子(分页功能)】
- Lucene-搜索的入门例子
- lucene4.6索引创建和搜索例子
- lucene多种搜索方式详解例子
- lucene(全文搜索)_luceneweb例子
- 一个lucene搜索高亮显示的例子。
- lucene多种搜索方式详解例子
- lucene多种搜索方式详解例子
- 一个lucene对数据库表做全文搜索的例子
- lucene多种搜索方式详解例子
- lucene常用搜索例子
- Lucene多种搜索方式详解例子