一:多样化的搜索 /** *** 一个关键字,对一个字段进行查询 **** */
QueryParser qp = new QueryParser("content",analyzer);
query = qp.parse(keyword);
Hits hits = searcher.search(query);
/** *** 模糊查询 **** */
Term term = new Term("content",keyword);
FuzzyQuery fq = new FuzzyQuery(term);
Hits hits = searcher.search(fq);
/** *** 一个关键字,在两个字段中查询 **** */
/*
* 1.BooleanClause.Occur[]的三种类型: MUST : + and MUST_NOT : - not SHOULD : or
* 2.下面查询的意思是:content中必须包含该关键字,而title有没有都无所谓
* 3.下面的这个查询中,Occur[]的长度必须和Fields[]的长度一致。每个限制条件对应一个字段
*/
BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.SHOULD,BooleanClause.Occur.MUST};
query=MultiFieldQueryParser.parse(keyword,new String[]{"title","content"},flags,analyzer);
/** *** 两个(多个)关键字对两个(多个)字段进行查询,默认匹配规则 **** */
/*
* 1.关键字的个数必须和字段的个数相等
* 2.由于没有指定匹配规定,默认为"SHOULD" 因此,下面查询的意思是:"title"中含有keyword1 或 "content"含有keyword2.
* 在此例中,把keyword1和keyword2相同
*/
query=MultiFieldQueryParser.parse(new String[]{keyword,keyword},new
String[]{"title","content"},analyzer);
/** *** 两个(多个)关键字对两个(多个)字段进行查询,手工指定匹配规则 **** */
/*
* 1.必须 关键字的个数 == 字段名的个数 == 匹配规则的个数
* 2.下面查询的意思是:"title"必须不含有keyword1,并且"content"中必须含有keyword2
*/
BooleanClause.Occur[] flags = new
BooleanClause.Occur[]{BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.MUST};
query=MultiFieldQueryParser.parse(new String[]{keyword,keyword},new
String[]{"title","content"},flags,analyzer);
/** *** 对日期型字段进行查询 **** */
/** *** 对数字范围进行查询 **** */
/*
* 1.两个条件必须是同一个字段
* 2.前面一个条件必须比后面一个条件小,否则找不到数据
* 3.new RangeQuery中的第三个参数&#xff0c;表示是否包含"&#61;" true: >&#61; 或 <&#61; false: > 或 <
* 4.找出 55>&#61;id>&#61;53 or 60>&#61;id>&#61;57:
*/
Term lowerTerm1 &#61; new Term("id","53");
Term upperTerm1 &#61; new Term("id","55");
RangeQuery rq1 &#61; new RangeQuery(lowerTerm1,upperTerm1,true);
Term lowerTerm2 &#61; new Term("id","57");
Term upperTerm2 &#61; new Term("id","60");
RangeQuery rq2 &#61; new RangeQuery(lowerTerm2,upperTerm2,true);
BooleanQuery bq &#61; new BooleanQuery();
bq.add(rq1,BooleanClause.Occur.SHOULD);
bq.add(rq2,BooleanClause.Occur.SHOULD);
Hits hits &#61; searcher.search(bq);
二&#xff1a;结果排序
排序的关键点有两个&#xff1a;
1:首先你要排序的字段必须是被index的&#xff0c;并且是untokenized的。
如&#xff1a;
doc.add(newField("click",dv.get("click").toString(),Field.Store.NO,Field.Index.UN_TOKENIZED)); 2&#xff1a;在检索时候&#xff1a;
如&#xff1a;
/***** 排序 *****/
/*
* 1.被排序的字段必须被索引过(Indexecd)&#xff0c;在索引时不能 用 Field.Index.TOKENIZED
* (用UN_TOKENIZED可以正常实现.用NO时查询正常&#xff0c;但排序不能正常设置升降序)
* 2.SortField类型
* SCORE、DOC、AUTO、STRING、INT、FLOAT、CUSTOM此类型主要是根据字段的类型选择
* 3.SortField的第三个参数代表是否是降序true:降序 false:升序
*/
Sort sort &#61; new Sort(new SortField[]{new SortField("click", SortField.INT, true)});
Hits hits &#61; searcher.search(querystring,sort);
/*
* 按日期排序
*/
Sort sort &#61; new Sort(new SortField[]{new SortField("createTime", SortField.INT, false)});
/***** 过滤器 ******/
QueryParser qp1 &#61; new QueryParser("content",analyzer);
Query fquery &#61; qp1.parse("我");
BooleanQuery bqf &#61; new BooleanQuery();
bqf.add(fquery,BooleanClause.Occur.SHOULD);
QueryFilter qf &#61; new QueryFilter(bqf);
Hits hits &#61; searcher.search(query);