lucene+heritrix day2

shibenjie 2008-04-03 03:51:48
package ear.lucenedemo.process;

import java.io.IOException;

import org.apache.lucene.index.Term;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;

public class IndexSearcherTest {

private static String INDEX_STORE_PATH="d:\\lucene\\IndexReader";

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
IndexSearcherTest.search(INDEX_STORE_PATH, "女");
}
public static void search(String path,String keyword) throws IOException{
//初始化一个IndexSearch
IndexSearcher searcher=new IndexSearcher(path);
//创建一个Term对象
Term term=new Term("bookname",keyword);
//构建一个Query对象(表示一次查询),注意:Query是一个抽象类,要new一个Query的实现类
Query query=new TermQuery(term);

//开始检索,检索的结果存放在Hits对象里面(Hits表示一次查询的结果)
//IndexSearcher的search方法是整个检索系统的核心,他将一个query对象送入后台,并检索出结果
Hits hits=searcher.search(query);
//显示查询结果
System.out.println("有"+hits.length()+"文档匹配,如下:");
for(int i=0;i<hits.length();i++){
System.out.println("========================");
//取得当前结果集中第i个Document
System.out.println(hits.doc(i));
//取得当前结果集中第i个Document的得分,也就是匹配率的高低
System.out.println("匹配度率为:"+hits.score(i));
//取得当前结果集中第i个Document的索引内部ID值
System.out.println("匹配文档的ID为:"+hits.id(i));
System.out.println("========================");
}

}

}



package ear.lucenedemo.process;

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.IndexModifier;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;

public class IndexReaderTest {

private static String INDEX_STORE_PATH="d:\\lucene\\IndexReader";

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// IndexReaderTest.createIndex(INDEX_STORE_PATH);
// IndexReaderTest.indexReaderTest(INDEX_STORE_PATH);
// IndexReaderTest.deleteIndex(INDEX_STORE_PATH);
// IndexReaderTest.useFieldDeleteDoc(INDEX_STORE_PATH);
IndexReaderTest.useIndexModifierDelDoc(INDEX_STORE_PATH);
}
/**
* 创建索引
* @param path 索引的路径
* @throws IOException
*/
public static void createIndex(String path) throws IOException{
IndexWriter writer=new IndexWriter(INDEX_STORE_PATH,
new StandardAnalyzer(),true);
writer.setUseCompoundFile(false);

Document doc1=new Document();
Document doc2=new Document();
Document doc3=new Document();
Field f1=new Field("bookname","钢铁是怎样炼成的",Field.Store.YES,
Field.Index.TOKENIZED);
Field f2=new Field("bookname","英雄儿女",Field.Store.YES,
Field.Index.TOKENIZED);
Field f3=new Field("bookname","篱笆女人和狗",Field.Store.YES,
Field.Index.TOKENIZED);

doc1.add(f1);
doc2.add(f2);
doc3.add(f3);
writer.addDocument(doc1);
writer.addDocument(doc2);
writer.addDocument(doc3);
writer.close();
}
/**
*
* @param path 索引路径
* @throws IOException
*/
public static void indexReaderTest(String path) throws IOException{
//使用IndexReader来读取索引
IndexReader reader=IndexReader.open(path);

//显示索引内的所有Document
System.out.println("索引文档列表:");
for(int i=0;i<reader.numDocs();i++){
System.out.println(reader.document(i));
}
//输出当前的索引版本
System.out.println("版本:"+reader.getVersion());
//输出当前的文档数量
System.out.println("索引内文档数量是:"+reader.numDocs());

//构造一个词条并在索引中查找
System.out.println("\n查找词条“女”");
Term term1=new Term("bookname","女");
TermDocs docs=reader.termDocs(term1);
while(docs.next()){
System.out.println("---------------------------------------");
System.out.println("含有所查找的<"+term1+">的Document的编号为:"+docs.doc());
System.out.println("在文档中出现的次数为:"+docs.freq());
System.out.println("---------------------------------------");

}
//不要忘记关闭IndexReader
reader.close();

//再次向文档中添加一个文档
IndexWriter writer2=new IndexWriter(path,new StandardAnalyzer(),
false);
writer2.setUseCompoundFile(false);
Document doc4=new Document();
Field f4=new Field("bookname","钢铁战士",Field.Store.YES,
Field.Index.TOKENIZED);

doc4.add(f4);
f4=new Field("bookname","钢男士怎样炼成的",Field.Store.YES,Field.Index.TOKENIZED);
doc4.add(f4);
writer2.addDocument(doc4);
writer2.close();

System.out.println("==================================================");

//使用IndexReader来读取索引
IndexReader reader2=IndexReader.open(INDEX_STORE_PATH);

//显示索引中的所有文档
System.out.println("索引文档列表:");
for(int i=0;i<reader2.numDocs();i++){
System.out.println(reader2.document(i));
}

//输出当前索引的版本信息
System.out.println("版本:"+reader2.getVersion());
//输出当前索引的文档数量
System.out.println("索引内的文档数量的是"+reader2.numDocs());

System.out.println("\n查找词条“女”");
Term term2=new Term("bookname","女");
docs=reader2.termDocs(term2);
while(docs.next()){
System.out.println("---------------------------------------");
System.out.println("含有所查找的<"+term2+">的Document的编号为:"+docs.doc());
System.out.println("在文档中出现的次数为:"+docs.freq());
System.out.println("---------------------------------------");

}

System.out.println("\n查找词条“钢”");
Term term3=new Term("bookname","钢");
docs=reader2.termDocs(term3);
while(docs.next()){
System.out.println("---------------------------------------");
System.out.println("含有所查找的<"+term3+">的Document的编号为:"+docs.doc());
System.out.println("在文档中出现的次数为:"+docs.freq());
System.out.println("---------------------------------------");

}

}

public static void deleteIndex(String path) throws IOException{
IndexReader reader=IndexReader.open(path);
reader.deleteDocument(0);
//要对 IndexReader进行关闭,这样才实现了类似回收站的删除,
//删除后的文件被放入deletable文件中,因为是回收站似的删除,所以还可以回复哦
reader.close();

//要使用一个新的IndexReader打开索引,如果还是用原来的IndexReader的话,那么就会出现异常
IndexReader reader2=IndexReader.open(path);
System.out.println(reader2.numDocs());
reader2.undeleteAll();
System.out.println("索引文档列表:");
for(int i=0;i<reader2.numDocs();i++){
System.out.println(reader2.document(i));
}
reader2.close();
}

public static void useFieldDeleteDoc(String path) throws Exception{
IndexReader reader=IndexReader.open(path);
Term term=new Term("bookname","女");
//用term进行批量文档的删除,Term类是用于表示词条的一个工具
//IndexReader的deleteDocument()方法是一个能够批量删除索引的方法
reader.deleteDocuments(term);
reader.close();

IndexReader reader2=IndexReader.open(path);
//reader2.undeleteAll();
System.out.println(reader2.numDocs());
reader2.close();

}
public static void useIndexModifierDelDoc(String path) throws IOException{
//注意:IndexModifier这个类是lucene2.0新增加的一个类
//IndexWriter这个类功能都在该类中了,该类只不过有增加了对文档进行删除的功能
//这样IndexModifier既有修改索引的功能,又有了删除索引的功能
IndexModifier modifier=new IndexModifier(path,new StandardAnalyzer(),false);
System.out.println("删除前的文档数目:"+modifier.docCount());
modifier.deleteDocument(0);
System.out.println("删除后文档的数目:"+modifier.docCount());
modifier.close();

//用IndexReader进行索引的恢复
IndexReader reader=IndexReader.open(path);
reader.undeleteAll();
reader.close();
System.out.println("恢复删除后文档的数目:"+reader.numDocs());
}

}












...全文
55 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
huhaozhong 2008-07-07
  • 打赏
  • 举报
回复

雕虫小技
caoxu1987728 2008-04-21
  • 打赏
  • 举报
回复
大虾,太牛了了

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧