今天看视频学了几个小知识点:
1、用write.deleteDocuments();方法删除一个索引,参数可以是Query,也可以是Term。(这时删除的文档被储存在一个回收站中,可以被恢复)
2、使用IndexReader进行恢复(恢复时必须把IndexReader的只读(readOnly)设置为false)
3、将回收站中被删除的数据清空用writer.forceMerge()实现
视频看累了就上网找了个简单的程序,然后仿照别人的自己写了写,可是运行出来并不是我想要的结果,不管有没有要搜的东西总会打印出第一条内容。
以下是代码,亲们,帮忙找找错哈 !
//基础类
package myrecorder.telephonenumber.Lucene;
public class Recorder
{
private int id;
private String name;
private String number;
Recorder(){};
Recorder(int id,String name,String number)
{
this.id=id;
this.name=name;
this.number=number;
}
public void setId(int id)
{
this.id = id;
}
public void setName(String name)
{
this.name=name;
}
public void setNumber(String number)
{
this.number=number;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public String getNumber()
{
return number;
}
}
//操作类:包含创建索引和搜索的方法
package myrecorder.telephonenumber.Lucene;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
public class Operator
{
private static Directory directory=null;
private static final Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_35);
//创建索引
public void index(List<Recorder> list)
{
IndexWriter writer=null;
try
{
directory=FSDirectory.open(new File("f:Lucene/Index_03"));
writer=new IndexWriter(directory,new IndexWriterConfig(Version.LUCENE_35,analyzer));
Document document=new Document();
for(Recorder re:list)
{
Field id=new Field("id",String.valueOf(re.getId()),Field.Store.YES,Field.Index.NOT_ANALYZED);
Field name=new Field("name",re.getName(),Field.Store.YES,Field.Index.ANALYZED);
Field number=new Field("number",String.valueOf(re.getNumber()),Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(id);
document.add(name);
document.add(number);
writer.addDocument(document);
}
}
catch(CorruptIndexException e)
{
e.printStackTrace();
}
catch (LockObtainFailedException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if(writer!=null)
writer.close();
}
catch(CorruptIndexException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
//搜索
public List<Recorder> search(String fieldname,String criteria)
throws CorruptIndexException, IOException, ParseException
{
List<Recorder> list=new ArrayList<Recorder>();
IndexReader reader=IndexReader.open(directory);
IndexSearcher searcher=new IndexSearcher(reader);
QueryParser parser=new QueryParser(Version.LUCENE_35,fieldname,analyzer);
Query query=parser.parse(criteria);
TopDocs tds=searcher.search(query, 10);
int total=tds.totalHits;
System.out.println("共搜索到"+total+"条结果");
ScoreDoc sds[]=tds.scoreDocs;
for(int i=0;i<sds.length;i++)
{
Document doc=searcher.doc(sds[i].doc);
Recorder recorder=new Recorder();
recorder.setId(Integer.parseInt(doc.get("id")));
recorder.setName(doc.get("name"));
recorder.setNumber(doc.get("number"));
list.add(recorder);
}
reader.close();
searcher.close();
return list;
}
}
//测试类
package myrecorder.telephonenumber.Lucene;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
public class Test {
public static void main(String[] args)
{
Test t=new Test();
t.init();
t.search();
}
//以下方法用来初始化文本内容
public void init()
{
List<Recorder> list=new ArrayList<Recorder>();
list.add(new Recorder(01,"李某某","18253512345"));
list.add(new Recorder(02,"李某某","12345678901"));
list.add(new Recorder(03,"王某某","18345656567"));
list.add(new Recorder(04,"孙某某","18253512345"));
list.add(new Recorder(05,"李某某","12345678901"));
list.add(new Recorder(06,"王某某","18345656567"));
list.add(new Recorder(07,"孙某某","18253512345"));
//list.add(new Recorder(08,"李某某","12345678901"));
//list.add(new Recorder(09,"王某某","18345656567"));
Operator op=new Operator();
op.index(list);
System.out.println("创建索引完成");
}
public void search()
{
Operator opr=new Operator();
try
{
List<Recorder> list=opr.search("name","张某某");
if(list.size()>0)
{System.out.println("找到"+list.size()+"个结果");
for(Recorder recorder:list)
{
System.out.println("id="+recorder.getId()+" name="+
recorder.getName()+" number="+recorder.getNumber());
}
}
else
{
System.out.println("没有搜索到结果");
}
}
catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
不知道哪出错了,运行结果总是不对。运行结果如下图所示: