1,使用 Filter 对搜索结果进行过滤,可以获得更小范围内更精确的结果。 RangeFilter filter = new RangeFilter("forum.id","1","1",true,true);//设置过滤字段 相当于SQL的 “forumId = 1”
2,在搜索时有时你想要一个排好序的结果集,就像SQL语句的“order by”,lucene能做到:通过Sort。 Sort sort = new Sort(“time”); //相当于SQL的“order by time” Sort sort = new Sort(“time”, true); // 相当于SQL的“order by time desc”
public static void searchWildcardQuery(File indexDir, String q) throws Exception {
Directory fsDir = FSDirectory.getDirectory(indexDir);
IndexSearcher is = new IndexSearcher(fsDir);// ① 打开索引
QueryParserTest parser = new QueryParserTest("title", new StandardAnalyzer());
Query wildQuery = parser.createWildQuery(new Term("title",q)); // ② 分析查询
long start = new Date().getTime();
Sort sort = new Sort("id",true);//降序排列
RangeFilter filter = new RangeFilter("forum.id","1","1",true,true);//设置过滤字段
BooleanQuery.setMaxClauseCount(is.maxDoc());
ScoreDoc[] docs = is.search(wildQuery,filter, is.maxDoc(),sort).scoreDocs; // ③ 搜索索引
long end = new Date().getTime();
System.err.println("Found " + docs.length + " document(s) (in "
+ (end - start) + "milliseconds) that matched query: " + q);
int count = 1;
for (int i = 0; i < docs.length; i++) {
Document doc = is.doc(docs[i].doc); ; // ④ 得到匹配的文档
if(Integer.parseInt(doc.get("forum.id"))==1 && Integer.parseInt(doc.get("status"))==1){
System.out.println("file: "+count+"_"+ doc.get("id")+"_" + doc.get("title"));
count++;
}
}
}