posts - 0,  comments - 3,  trackbacks - 0

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 李桢 阅读(292) 评论(0)  编辑  收藏 所属分类: lucene

只有注册用户登录后才能发表评论。


网站导航:
 
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(1)

文章分类

文章档案

搜索

  •  

最新评论