filter过滤操作,对query出来的文档进行再次过滤。
public class SearcherUtil {
private Directory directory=null;
private IndexWriter writer=null;
private IndexReader reader=null;
private IndexSearcher searcher=null;
public void createMyIndex()
{
try {
directory=FSDirectory.open(new File("D:/lucene/index03"));
writer=new IndexWriter
(directory, new IndexWriterConfig(Version.LUCENE_45,new StandardAnalyzer(Version.LUCENE_45)));
File[] files=new File("D:/src").listFiles();
for(int i=0;i<files.length;i++)
{
File file=files[i];
Document doc=new Document();
doc.add(new StringField("filename", file.getName(), Field.Store.YES));
doc.add(new StringField("path", file.getAbsolutePath(), Field.Store.YES));
FileInputStream fis=new FileInputStream(file);
doc.add(new TextField("contents", new BufferedReader(new InputStreamReader(fis, "UTF-8"))));
doc.add(new LongField("size", file.length(),Field.Store.YES));
System.out.print(file.length()+" : ");
System.out.println("lucene crate index"+i+"from"+file.getAbsolutePath() );
writer.addDocument(doc);
writer.commit();
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
if(writer!=null)
{
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writer=null;
}
}
}
public void searchByFilter(String string,Filter filter)
{
try {
directory=FSDirectory.open(new File("D:/lucene/index03"));
reader= DirectoryReader.open(directory);
searcher=new IndexSearcher(reader);
QueryParser queryParser=new QueryParser(Version.LUCENE_45,"contents",new StandardAnalyzer(Version.LUCENE_45));
Query query=queryParser.parse(string);
ScoreDoc[] sds = searcher.search(query,filter,100).scoreDocs;
// ScoreDoc[] sds = searcher.search(query,100).scoreDocs;
System.out.println("找到了"+sds.length+"篇文章");
for(ScoreDoc doc:sds){
Document document=searcher.doc(doc.doc);
System.out.println(document.get("size")+" : "+document.get("filename"));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally
{
if(reader!=null)
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
测试:
public void searchByFilterTest(){
SearcherUtil searcherUtil=new SearcherUtil();
// Filter filter=TermRangeFilter.newStringRange("filename", "cpp.txt","lucene.txt", true, true);
// Filter filter=NumericRangeFilter.newLongRange("size", (long)100, (long)500, true, true);
Query query=new TermQuery(new Term("contents", "java"));
Filter filter=new QueryWrapperFilter(query);
searcherUtil.searchByFilter("lucene",filter);
}