package cn.zqh.lucene.query;
import java.io.IOException;
import java.util.Date;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.NumberTools;
import org.apache.lucene.document.DateTools.Resolution;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.junit.Test;
import cn.zqh.lucene.highlight.IndexDao;
import cn.zqh.lucene.highlight.QueryResult;
import cn.zqh.lucene.utils.File2DocumentUtils;
/**
zqh
*对象查询
*/
public class QueryTest {
IndexDao indexDao = new IndexDao();
/**
* 打印结果
*/
public void queryAddPrintResult(Query query) throws ParseException, IOException{
System.out.println("对应字符串的查询语法:"+query);
QueryResult qr =indexDao.search(query, 0, 100);
System.out.println("总共有【"+qr.getRecordCount()+"】条匹配的记录");
for(Document doc : qr.getRecordList()){
File2DocumentUtils.printDocumentInfo(doc);
}
}
/**
* 关键词查询
* 语法:name:连接池
*/
@Test
public void testTermQuery() throws ParseException, IOException{
//英文关键字全是小写字符
Term term = new Term("name","连接池"); //某个属性中的关键字
Query query = new TermQuery(term);
queryAddPrintResult(query);
}
/**
* 范围搜索
* 1.文件大小
* 2.日期
* 语法:size:[000000000000le TO 000000000000rs]
* 不包含边界size:{000000000000le TO 000000000000rs}
*/
@Test
public void testRangeQuery() throws ParseException, IOException{
//根据文件大小搜索
Term lowerTerm = new Term("size",NumberTools.longToString(200));
Term upperTerm = new Term("size",NumberTools.longToString(500));
//如果是想搜索200字节到1000字节大小的文件,ye这样写
// Term lowerTerm = new Term("size","0200");
// Term upperTerm = new Term("size","1000");
Query query = new RangeQuery(lowerTerm,upperTerm,true);
queryAddPrintResult(query);
}
public static void main(String[] args){
System.out.println(NumberTools.longToString(1000)); //结果:000000000000rs rs表示26个英文字母
System.out.println(DateTools.dateToString(new Date(),Resolution.DAY));//日期格式
}
/**
* 通配符查询
* ?代表一个字符,* 代表0或者多个字符
* 语法:name:连接?
*/
public void testWildcardQuery() throws ParseException, IOException{
Term term = new Term("name","链接?");
Query query = new TermQuery(term);
queryAddPrintResult(query);
}
/**
* 短语查询 如要查:lucene入门教程
* name:
*
*/
public void testPhraseQuery() throws ParseException, IOException{
PhraseQuery phraseQuery = new PhraseQuery();
//方法1:指定位置
phraseQuery.add(new Term("name","lucene"),1); //lucene和教程之间差一个一个词 万一我不知道之间差多少怎么办?设置范围
phraseQuery.add(new Term("name","教程"),3);
//方法2
phraseQuery.add(new Term("name","lucene"));
phraseQuery.add(new Term("name","教程"));
phraseQuery.setSlop(5); //表示两词之间相差5个词内
queryAddPrintResult(phraseQuery);
}
/**
* boolean查询
*
*/
public void testBooleanQuery() throws ParseException, IOException{
//条件1
PhraseQuery query1 = new PhraseQuery();
query1.add(new Term("name","lucene"));
query1.add(new Term("name","教程"));
query1.setSlop(5);
//条件2
Term lowerTerm = new Term("size",NumberTools.longToString(200));
Term upperTerm = new Term("size",NumberTools.longToString(500));
Query query2 = new RangeQuery(lowerTerm,upperTerm,true);
//组合
BooleanQuery boolQuery = new BooleanQuery();
boolQuery.add(query1, Occur.MUST); //表示条件1必须出现
boolQuery.add(query2, Occur.MUST); //表示条件2必须出现
queryAddPrintResult(boolQuery);
}
}