热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lucene多样化搜索,结果排序。

一:多样化的搜索 /** *** 一个关键字,对一个字段进行查询 **** */QueryParser qp = new QueryParser("content"
一:多样化的搜索

/** *** 一个关键字,对一个字段进行查询 **** */
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);




推荐阅读
author-avatar
丁仪亓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有