jar包:lucene-core-2.0.0.jar 可以到官方网站下载
今天先记下简单的lucene索引创建 搜索、删除和恢复
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.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
public class SimpleLucene {
private void myCreateIndex(){
try {
/*
* 在硬盘指定目录创建索引
*/
IndexWriter writerdata=new IndexWriter("c:/index",new StandardAnalyzer(),true); //第3个参数为true的话会先清空目录,再创建,否则在原基础上增加
Document doc1=new Document(); //可以把document 看成是数据中的一行记录
Field field1=new Field("data","中国人民解放军",Field.Store.YES,Field.Index.TOKENIZED);//参数说明见附图
doc1.add(field1);
writerdata.addDocument(doc1);
writerdata.optimize();
writerdata.close(); // 写完后要记得关闭
/*
* 在内存中创建索引,速度肯定比在硬盘中快啦,但计算机关闭后,索引将消失.
*/
RAMDirectory ramdir=new RAMDirectory();
IndexWriter writerram=new IndexWriter(ramdir,new StandardAnalyzer(),true);
Document doc2=new Document();
Field field2=new Field("ram","什么时间能买起房子",Field.Store.YES,Field.Index.TOKENIZED);
doc2.add(field2);
writerram.addDocument(doc2);
writerram.optimize();
writerram.close();
System.out.print("创建成功");
} catch (Exception e) {
e.printStackTrace();
}
}
private void mySearch()
{
try {
IndexSearcher searcher=new IndexSearcher("c:/index"); //读取索引目录
QueryParser parser=new QueryParser("data",new StandardAnalyzer()); //在哪个字段查询
Query query=parser.parse("中国"); //要查询的关键字
Hits hits=searcher.search(query); //返回查询结果
for (int i = 0; i <hits.length(); i++) {
Document doc=new Document();
System.out.println(hits.doc(i).get("data")); //得到document 对象,根据字段返回数据
}
if(hits.length()==0)
System.out.println("没有找到结果");
searcher.close(); //记得关闭
} catch (Exception e) {
e.printStackTrace();
}
/*
* 内存中查询道理是一样的,把索引地址和查询字段改变一下就OK
*/
}
/*
* 删除索引
*/
private void mydelete()
{
try {
IndexReader reader=IndexReader.open("c:/index");
int num=reader.numDocs(); //得到索引的中doc的数量,相当于数据库中有几行记录
reader.deleteDocuments(new Term("test1","中国")); //删除中包含中国的索引
for (int i = 0; i <num; i++) { //通过循环删除所有索引
reader.deleteDocument(i); //这里的删除只是给文档做一个删除标记,看到执行的deleteDocument后,产生的Del文件用来记录这些标记过的文件
}
reader.close(); //同样要关闭
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 恢复删除的索引
*/
public void reDeleteIndex()
{
try {
IndexReader reader=IndexReader.open("c:/index");
reader.undeleteAll();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SimpleLucene rr=new SimpleLucene();
rr.myCreateIndex(); //创建索引
rr.mySearch(); //执行搜索
rr.mydelete(); //执行删除索引
rr.reDeleteIndex(); //执行恢复删除的索引
}
}
Field.Index
|
Field.Store
|
说明
|
TOKENIZED( 分词)
|
YES
|
文章的标题或内容(如果是内容的话不能太长)是可以被搜索的
|
TOKENIZED
|
NO
|
文章的标题或内容(内容可以很长)也是可以被看过的
|
NO
|
YES
|
这是不能被搜索的,它只是被搜索内容的附属物。如URL等
|
UN_TOKENIZED
|
YES/NO
|
不被分词,它作为一个整体被搜索,搜一部分是搜不出来的
|
NO
|
NO
|
没有这种用法
|
posted on 2007-07-01 10:09
李桢 阅读(291)
评论(0) 编辑 收藏 所属分类:
lucene