public class AdvancedSearch {
private Directory directory;
private IndexReader reader;
public AdvancedSearch(){
/**文件大小*/
int[] sizes = {90, 10, 20, 10, 60, 50};
/**文件名*/
String[] names = {"Michael.java", "Scofield.ini", "Tbag.txt", "Jack", "Jade", "Jadyer"};
/**文件内容*/
String[] contents = {"my java blog is http://blog.csdn.net/jadyer",
"my Java Website is http://www.jadyer.cn",
"my name is jadyer",
"I am a Java Developer",
"I am from Haerbin",
"I like java of Lucene"};
/**文件日期*/
Date[] dates = new Date[sizes.length];
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
IndexWriter writer = null;
Document doc = null;
try {
dates[0] = sdf.parse("20130407 15:25:30");
dates[1] = sdf.parse("20130407 16:30:45");
dates[2] = sdf.parse("20130213 11:15:25");
dates[3] = sdf.parse("20130808 09:30:55");
dates[4] = sdf.parse("20130526 13:54:22");
dates[5] = sdf.parse("20130701 17:35:34");
directory = FSDirectory.open(new File("myExample/01_index/"));
writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36)));
writer.deleteAll();
for(int i=0; i<sizes.length; i++){
doc = new Document();
doc.add(new NumericField("size",Field.Store.YES, true).setIntValue(sizes[i]));
doc.add(new Field("name", names[i], Field.Store.YES, Field.Index.ANALYZED_NO_NORMS));
doc.add(new Field("content", contents[i], Field.Store.NO, Field.Index.ANALYZED));
doc.add(new NumericField("date", Field.Store.YES, true).setLongValue(dates[i].getTime()));
writer.addDocument(doc);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != writer){
try {
writer.close();
} catch (IOException ce) {
ce.printStackTrace();
}
}
}
}
/**
* 获取IndexReader实例
*/
private IndexReader getIndexReader(){
try {
if(reader == null){
reader = IndexReader.open(directory);
}else{
//if the index was changed since the provided reader was opened, open and return a new reader; else,return null
//如果当前reader在打开期间index发生改变,则打开并返回一个新的IndexReader,否则返回null
IndexReader ir = IndexReader.openIfChanged(reader);
if(ir != null){
reader.close(); //关闭原reader
reader = ir; //赋予新reader
}
}
return reader;
}catch(Exception e) {
e.printStackTrace();
}
return null; //发生异常则返回null
}
/**
* 自定义QueryParser的搜索
* @param expr 搜索的表达式
*/
public void searchByCustomQueryParser(String expr){
IndexSearcher searcher = new IndexSearcher(this.getIndexReader());
QueryParser parser = new MyQueryParser(Version.LUCENE_36, "content", new StandardAnalyzer(Version.LUCENE_36));
try {
Query query = parser.parse(expr);
TopDocs tds = searcher.search(query, 10);
for(ScoreDoc sd : tds.scoreDocs){
Document doc = searcher.doc(sd.doc);
System.out.print("文档编号=" + sd.doc + " 文档权值=" + doc.getBoost() + " 文档评分=" + sd.score + " ");
System.out.println("size=" + doc.get("size") + " date=" + new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date(Long.parseLong(doc.get("date")))) + " name=" + doc.get("name"));
}
} catch (ParseException e) {
System.err.println(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
} finally {
if(null != searcher){
try {
searcher.close(); //记得关闭IndexSearcher
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 测试一下搜索效果
*/
public static void main(String[] args) {
AdvancedSearch advancedSearch = new AdvancedSearch();
advancedSearch.searchByCustomQueryParser("name:Jadk~");
advancedSearch.searchByCustomQueryParser("name:Ja??er");
System.out.println("------------------------------------------------------------------------");
advancedSearch.searchByCustomQueryParser("name:Jade");
System.out.println("------------------------------------------------------------------------");
advancedSearch.searchByCustomQueryParser("name:[h TO n]");
System.out.println("------------------------------------------------------------------------");
advancedSearch.searchByCustomQueryParser("size:[20 TO 80]");
System.out.println("------------------------------------------------------------------------");
advancedSearch.searchByCustomQueryParser("date:[20130407 TO 20130701]");
}
}
Lucene 3.6.2入门系列:高级搜索之自定义QueryParser
最新推荐文章于 2021-02-11 22:53:43 发布