今天将“Lucene学习”里面的程序贴到eclipse工程里实现了一下
加深了我对检索的理解
在全文检索中,可以和数据库进行一个简单的对比
全文检索没有表的概念,也就没有固定的fields,但是有记录,每一个记录就是一个Document对象
每一个document都可以有自己不同的fields,如下:
Document doc = new Document();
doc.add(Field.Keyword("filename",file.getAbsolutePath()));
//以下两句只能取一句,前者是索引不存储,后者是索引且存储
//doc.add(Field.Text("content",new FileReader(file)));
doc.add(Field.Text("content",this.chgFileToString(file)));
indexWriter.addDocument(doc);
在查询的时候,需要三个重要的参数
首先是库路径,即在哪个库里面进行检索(相当于database的路径):
Searcher searcher = new IndexSearcher(dbpath);
然后就是你以哪个字段,查询什么关键词,因为根据字段就可以得到字段对应的内容
在得到的内容中检索你的关键词,这个累死sql语句,只不过没有表的概念
Query query
= QueryParser.parse(searchkey,searchfield,new StandardAnalyzer());
然后开始查询,查询的结果就是document的集合:
Hits hits = searcher.search(query);
对得到的集合进行处理:
if(hits != null)
{
list = new ArrayList();
int temp_hitslength = hits.length();
Document doc = null;
for(int i = 0;i < temp_hitslength; i++){
doc = hits.doc(i);
//list.add(doc.get("filename"));
list.add(doc.get("content"));
}
}
附常用Field:
常用的Field方法如下:
方法
|
切词
|
索引
|
存储
|
用途
|
Field.Text(String name, String value)
|
Yes
|
Yes
|
Yes
|
切分词索引并存储,比如:标题,内容字段
|
Field.Text(String name, Reader value)
|
Yes
|
Yes
|
No
|
切分词索引不存储,比如:META信息,
不用于返回显示,但需要进行检索内容
|
Field.Keyword(String name, String value)
|
No
|
Yes
|
Yes
|
不切分索引并存储,比如:日期字段
|
Field.UnIndexed(String name, String value)
|
No
|
No
|
Yes
|
不索引,只存储,比如:文件路径
|
Field.UnStored(String name, String value)
|
Yes
|
Yes
|
No
|
只全文索引,不存储
|
切分词
就是指对文本进行切词,用于进行索引,上面可以看到切分的都会进行索引;索引即用于通过搜索词进行查询;存储表示是否存储内容本身。上面的
Field.Keyword方法就不切分但是可以索引,所以可以用这个字段进行查询,而Field.UnIndexed就不能进行查询了。但是由于
Field.Keyword不切分,所以当使用new
Term(searchkey,searchfield)进行查询时,给出的searchkey必须与vaue参数值完全一致才会查询出来,而
Field.Text和Field.UnStored则就不一样。
Lucene中国是一个非常好的网站,对Lucene内部结构进行了详细的分析,可以参考。