lucene之Query

来源:互联网 发布:介绍云计算的ppt 编辑:程序博客网 时间:2024/05/19 02:41

lucene之Query

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);
}

}