Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。
其功能非常的强大,api也很简单。总得来说用Lucene来进行建立
和搜索和操作数据库是差不多的(有点像),Document可以看作是
数据库的一行记录,Field可以看作是数据库的字段。用lucene实
现搜索引擎就像用JDBC实现连接数据库一样简单。
Lucene2.0,它与以前广泛应用和介绍的Lucene 1.4.3并不兼容。
Lucene2.0的下载地址是http://apache.justdn.org/lucene/java/
大家先看一个例子,通过这个例子来对
lucene
的一个大概的认识。
一个
Junit
测试用例:
(
为了让代码清晰好看,我们将异常都抛出
)
a)
这是一个建立文件索引的例子
public
void
testIndexHello()
throws
IOException
{
Date date1 =
new
Date();
//
可以说是创建一个新的写入工具
//
第一个参数是要索引建立在哪个目录里
//
第二个参数是新建一个文本分析器,这里用的是标准的大家也可以自己写一个
//
第三个参数如果是true,在建立索引之前先将c:\\index目录清空。
IndexWriter writer =
new
IndexWriter(
"c:\\index"
,
new
StandardAnalyzer(),
true
);
//
这个是数据源的文件夹
File file =
new
File(
"c:\\file"
);
/**
*
例子主要是将C:\\file目录下的文件的内容进行建立索引,将文件路径作为搜索内容的附属.
*/
if
(file.isDirectory())
{
String[] fileList = file.list();
for
(
int
i = 0; i < fileList.
length
; i++)
{
//
建立一个新的文档,它可以看作是数据库的一行记录
Document doc =
new
Document();
File f =
new
File(file,
fileList[i]);
Reader reader =
new
BufferedReader(
new
FileReader(f));
doc.add(
new
Field(
"file"
,reader));
//
为doument添加field
doc.add(
new
Field(
"path"
,f.getAbsolutePath(),Field.Store.
YES
,Field.Index.
NO
));
writer.addDocument(doc);
}
}
writer.close();
//
这一步是必须的,只有这样数据才会被写入索引的目录里
Date date2 =
new
Date();
System.
out
.println(
"
用时"
+(date2.getTime()-date1.getTime())+
"
毫秒"
);
}
注意:因为建立索引本来就是费时,所以说最后输出的用时会比较长,请不要奇怪。
b)
一个通过索引来全文检索的例子
public
void
HelloSearch()
throws
IOException, ParseException
{
IndexSearcher indexSearcher =
new
IndexSearcher(
"c:\\index"
);
//
和上面的IndexWriter一样是一个工具
QueryParser queryParser =
new
QueryParser(
"file"
,
//
这是一个分词器
new
StandardAnalyzer());
BufferedReader br =
new
BufferedReader(
new
InputStreamReader(System.
in
));
Query query = queryParser.parse(br.readLine());
//
这个地方Query是抽象类大家也注意一下,下面会讲到的
Hits hits = indexSearcher.search(query);
Document doc =
null
;
System.
out
.print(
"
正搜索................"
);
for
(
int
i = 0; i < hits.length(); i++)
{
doc = hits.doc(i);
System.
out
.println(
"
内容是:"
+doc.get(
"file"
));
//
注意这里输出的是什么
System.
out
.println(
"
文件的路径是:"
+ doc.get(
"path"
));
}
}
通过上面的两个例子应该可以看出Lucene还是比较简单的。
运行一下上面的两个例子,大家可能会说怎么doc.get(
“
file
”
);
返回的是空呢,我们马上会讲到。
下面讲一下索引的建立
其实从上面的例子就可以看出建立索引就用到Document,IndexWriter,Field。
最简单的步骤就是:
首先分别new 一个Document,IndexWriter,Field
然后用Doument.add()方法加入Field,
其次用IndexWrtier.addDocument()方法加入Document。
最后调用一下IndexWriter.close()方法关闭输入索引,这一步非常的重要只有调用这个方法索引才会被写入索引的目录里,而这是被很多初学的人所忽略的。
Document
没有什么好介绍的,把它的作用看成数据库中的一行记录就行。
Field
是一个比较重要的也是比较复杂的:
看一下它的构造函数有5个:
Field
(String name, byte[] value, Field.Store store)
Field
(String name, Reader reader)
Field
(String name, Reader reader, Field.TermVector termVector)
Field
(String name, String value, Field.Store store, Field.Index index)
Field
(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector)
在Field中有三个内部类:Field.Index,Field.Store,Field.termVector,而构造函数也用到了它们。
注意:
termVector
是Lucene 1.4
新增的它提供一种向量机制来进行模糊查询的这个不常用,默认是false不过是什么对于一般查询无影响。
它们的不同的组合,在全文检索中有着不同的作用。看看下面的表吧:
而对于
Field
(String name, Reader reader)
Field
(String name, Reader reader, Field.TermVector termVector)
他们是Field.Index.TOKENIZED和Field.Store.NO的。这就是为什么我们在上面的例子中会出现文章的内容为null了。因为它只是被索引了,而并没有被存储下来。如果一定要看到文章的内容的话可以通过文章的路径得到毕竟文章的路径是作为搜索的附属物被搜索出来了。而我们在Web开发的时候一般是将大数据放在数据库中,不会放在文件系统中,更不会放在索引目录里,因为它太大了操作会加大服务器的负担。
下面介绍一下IndexWriter:
它就是一个写入索引的写入器,它的任务比较简单:
1.
用addDocument()将已经准备好写入索引的document们加入
2.
调用close()将索引写入索引目录
先看一下它的构造函数:
IndexWriter
(Directory d, Analyzer a, boolean create)
(未完)
posted on 2007-03-05 10:05
坚持学习,每天进步一些 阅读(232)
评论(0) 编辑 收藏 所属分类:
OpenSource