1.搜索部分
~1.精确搜索
Query query=new TermQuery(new Term("id","1"));
~2.范围搜索
//字符串类型范围 true表示是否包括边界值
Query query=new TermRangeQuery("id", "1", "4", true, true);
//数字类型
//query=NumericRangeQuery.newIntRange("age", 20, 21, true, true);
//日期类型
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-mm-dd");
query=NumericRangeQuery.newLongRange("date", dateFormat.parse("2010-09-22").getTime(), dateFormat.parse("2012-09-22").getTime(), true, true);
~3.前缀搜索
//前缀搜索 以一个单词前缀为基础
query=new PrefixQuery(new Term("name", "s"));
~4.通配符搜索
//通配符搜索 *表示任意多个 ?表示一个
query=new WildcardQuery(new Term("name","s??"));
~5.多条件搜索
//多条件搜索 Occur.MUST必须出现 Occur.SHOULD可以出现 Occur.MUST_NOT必须不出现
query1=new BooleanQuery();
query1.add(new TermQuery(new Term("name","limao5")), Occur.SHOULD);
query1.add(new TermQuery(new Term("id","5")), Occur.MUST_NOT);
===========================================
~6.QueryParse查询
//QueryParse查询 数字区域不能实现
//设置默认操作符
//parser.setDefaultOperator(Operator.AND);
//搜索I LIKE的内容 默认为Or的关系
query =parser.parse("I LIKE");
//搜索I LIKE 两个都存在的
query =parser.parse("I AND LIKE");
//搜索name中的limao1@my(出现两个) name:limao1(出现一个) name:limao(没有)
query =parser.parse("name:limao1");
//用通配符来操作
query =parser.parse("name:l*");
//通配符在首位的情况 默认是不可以的 需要改变默认设置
//设置默认首位通配符
parser.setAllowLeadingWildcard(true);
query =parser.parse("name:*my");
//搜索多条件查询name中要有@my content中不能有sYP1
query =parser.parse("+ name:@my - sYP1");
//匹配一个区间的信息[]表示开区间 {}表示闭区间
query =parser.parse("id:[1 TO 4]");
query =parser.parse("id:{1 TO 4}");
//完全匹配一句短语
query =parser.parse("\"I LIKE sYP1\"");
//匹配I sYP1中间有一个空格的
query =parser.parse("\"I sYP1\"~1");
//模糊查询
query =parser.parse("name:limao~");
===========================================
~7.分页查询
---1.再查询的方式 这种方式一定得注意数组越界
Directory directory=util.getDirectory();
IndexReader indexReader=util.IndexReaderUtil(directory);
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
Query query=parser.parse("Java");
TopDocs topDocs=indexSearcher.search(query, 100);
ScoreDoc[] docs=topDocs.scoreDocs;
System.out.println("总数:"+topDocs.totalHits);
//一次先把所有的查出来
int start=5;
int end=10;
for (int i = start; i < end; i++) {
//7.根据searcher和ScoreDoc对象获取具体Document对象
Document d=indexSearcher.doc(docs[i].doc);
//8.根据document对象获取需要的值
System.out.println(d.get("filename")+"["+d.get("path")+"]");
}
---2.searcherAfter分页操作方式
Directory directory=util.getDirectory();
IndexReader indexReader=util.IndexReaderUtil(directory);
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
QueryParser parser=new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));
Query query=parser.parse("Java");
int pagestart=1;
int pageSize=5;
//表示上一页的最后一条
int last=(pagestart-1)*pageSize-1;
//这里的查询数量也应该依次增加,不该一次查完
int score=pagestart*pageSize;
TopDocs topDocs=indexSearcher.search(query, score);
ScoreDoc[] docs=topDocs.scoreDocs;
if(last==-1){
topDocs=indexSearcher.searchAfter(null, query,5);
}else{
topDocs=indexSearcher.searchAfter(docs[last], query,5);
}
//docs[4]表示上一页的最后一条 null表示第一页
docs= topDocs.scoreDocs;
System.out.println("总数:"+topDocs.totalHits+"docs:"+docs.length);
for (int i = 0; i < docs.length; i++) {
//7.根据searcher和ScoreDoc对象获取具体Document对象
Document d=indexSearcher.doc(docs[i].doc);
//8.根据document对象获取需要的值
System.out.println(d.get("filename")+"["+d.get("path")+"]");
}